Pindahkan tata letak saat keyboard lunak ditampilkan?

146

Saya memiliki beberapa elemen dalam RelativeView dengan set atribut align bottom, ketika soft keyboard muncul, elemen tersebut disembunyikan oleh soft keyboard.

Saya ingin mereka naik sehingga jika ada cukup ruang layar, mereka ditampilkan di atas keyboard, atau membuat bagian di atas keyboard dapat digulir sehingga pengguna masih dapat melihat elemennya.

Ada ide tentang cara mendekati ini?

Makan malam
sumber
Referensi yang diperbarui dari blog pengembang android
Jayabal
@Dinedal Bagaimana Anda menyetel atribut align bottom ke RelativeView Anda ???
KJEjava48

Jawaban:

98

Anda juga dapat menggunakan kode ini dalam onCreate()metode:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Bobs
sumber
12
Bagi saya, bahkan jika saya menyetel AdjustPan screnn pindah hanya ke teks edit yang telah saya klik tetapi tidak seluruh tata letaknya
murt
35

Tambahkan AndroidManifest.xml untuk aktivitas Anda:

android:windowSoftInputMode="adjustPan|adjustResize"
Serhii Bohutskyi
sumber
22
Menurut dokumen, perilaku ini tidak ditentukan jika Anda menggunakan dua tanda "sesuaikan ..." di sini. Lihat developer.android.com/guide/topics/manifest/…
joe1806772
23

Lakukan perubahan dalam aktivitas file Manifest Anda seperti

android:windowSoftInputMode="adjustResize"

ATAU

Buat perubahan dalam onCreate()metode Anda di kelas aktivitas seperti

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Jose Kurian
sumber
11
Mengapa Anda menggunakan bendera yang berbeda?
CoolMind
Versi saat ini membutuhkan awalan android: android: windowSoftInputMode = "adjustResize"
Andrea Leganza
21

masalah serupa yang saya hadapi dengan tata letak saya yang terdiri dari tampilan gulir di dalamnya. Setiap kali saya mencoba memilih teks di EditText, bilah tindakan Salin / Potong / Tempel akan dipindahkan dengan kode di bawah ini sehingga tidak mengubah ukuran tata letak

android:windowSoftInputMode="adjustPan"

Dengan memodifikasinya menjadi seperti di bawah ini

1) AndroidManifest.xml

android:windowSoftInputMode="stateVisible|adjustResize"

2) file style.xml, dalam gaya aktivitas

<item name="android:windowActionBarOverlay">true</item>

Berhasil. !!!!!!!!!!!!

Ronak Poriya
sumber
18

Di AndroidManifest.xml, jangan lupa untuk menyetel:

 android:windowSoftInputMode="adjustResize"

dan untuk RelativeLayout di dalam ScrollView, setel:

 android:layout_gravity="center" or android:layout_gravity="bottom" 

ini akan baik-baik saja

Zahra.HY
sumber
android: layout_gravity = "center" berfungsi, terima kasih! :) sekarang EditText bergerak di atas keyboard seperti yang saya inginkan
Pavel Biryukov
11

Untuk Kegiatan dalam metode oncreate sisipkan baris di bawah ini

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

dan untuk fragmen dalam metode onCreate-nya

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Rahul_Pawar
sumber
10

Ada 3 langkah yang harus diikuti untuk menggulir layar ke atas.

  1. Tulis dalam file manifes untuk aktivitas Anda:

android: windowSoftInputMode = "adjustResize"

  1. Tambahkan baris berikut dalam metode oncreate () aktivitas Anda

getWindow (). setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

  1. Kemudian tempatkan seluruh tampilan Anda di "Scrollview" dalam file XML seperti:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:background="@drawable/bg"
    android:layout_height="match_parent" 
    > 
    <RelativeLayout
         android:layout_width="fill_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center" >
        <TextView />
         .........
        <TextView />
        <EditText >
            <requestFocus />
        </EditText>
        <Button />
    </RelativeLayout>
 </ScrollView>

PS Jangan lupa untuk menambahkan android: layout_gravity = "center" di layout Relatif induk.

Heena Arora
sumber
8
<activity name="ActivityName"
    android:windowSoftInputMode="adjustResize">
    ...
</activity>

Tambahkan NestedScrollView di sekitar tata letak yang ingin Anda gulir, ini akan bekerja dengan sempurna

Prakash Reddy
sumber
6

Saya mencoba metode Diego Ramírez, berhasil. Di AndroidManifest:

    <activity
        android:name=".MainActivity"
        android:windowSoftInputMode="stateHidden|adjustResize">
        ...
    </activity>

Dalam activity_main.xml:

<LinearLayout ...
    android:orientation="vertical">

<Space
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_weight="1" />

<EditText
    android:id="@+id/edName"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10"
    android:hint="@string/first_name"
    android:inputType="textPersonName" />

<EditText ...>
...
</LinearLayout>
CoolMind
sumber
3

Saya telah menemukan solusi untuk masalah saya yang hampir sama dengan masalah Anda.

Pertama-tama, saya hanya memiliki LinearLayout dengan 2 elemen, ImageView dan LinearLayout yang berisi 2 EditText dan satu Tombol, jadi saya perlu memisahkannya dalam layar penuh tanpa keyboard, dan ketika keyboard muncul, mereka harus melihat lebih dekat.

Jadi saya menambahkan tampilan di antara mereka dengan atribut height di 0dp dan weight 1, yang memungkinkan saya memisahkan pandangan saya satu sama lain. dan ketika keyboard muncul, karena tidak memiliki ketinggian yang tetap, mereka hanya mengubah ukuran dan mempertahankan aspeknya.

Voila! Perubahan ukuran tata letak dan jarak antara pandangan saya sama saat keyboard ada atau tidak.

Diego Ramírez Vásquez
sumber
7
Mengapa Anda tidak memposting kode, untuk pemahaman yang lebih baik?
johnkarka
Saya memposting kode contoh di atas: stackoverflow.com/a/31994697/2914140 .
CoolMind
Anda dapat melakukannya dengan cara yang tidak terlalu rumit dengan menggunakan ConstraintLayoutdan menyematkan bagian atas ke atas dan bagian bawah ke bawah. Ketika keyboard terbuka, ukurannya secara alami akan berubah dengan menekan ruang di tengah (jika Anda menggunakan adjustResize)
hmac
2
  1. Jika pengguna menginginkan tugas ini menggunakan manifes, tambahkan baris ini dalam manifes
  2. Dalam manifes tambahkan baris ini: - android: windowSoftInputMode = "adjustPan" mis

Di File Java atau File Kotlin (Secara Terprogram): - Jika pengguna menginginkan ini menggunakan Activity, tambahkan baris di bawah ini dalam Metode onCreate

activity?.window()?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
safal bhatia
sumber
Hai dan selamat datang di stackoverflow, dan terima kasih atas jawabannya. Daripada hanya memposting blok kode, dapatkah Anda memberikan penjelasan singkat tentang masalah apa yang telah Anda selesaikan dan bagaimana Anda mengatasinya? Ini akan membantu orang-orang yang menemukan pertanyaan ini di masa mendatang untuk lebih memahami masalah dan cara menanganinya.
Plutian
1

Berikut adalah kode manifes lengkap

<activity
        android:name=".activities.MainActivity"
        android:windowSoftInputMode="adjustResize"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
Dantalian
sumber
1

jika Anda berada dalam fragmen maka Anda harus menambahkan kode di bawah ini ke onCreate Anda pada aktivitas Anda itu menyelesaikan masalah bagi saya

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Pratik Mohanrao Gondil
sumber
1

Dalam file manifes Anda tambahkan baris di bawah ini. Ini akan berhasil

<activity name="MainActivity"
    android:windowSoftInputMode="stateVisible|adjustResize">
    ...
</activity>
Shivam Garg
sumber
1

Saya baru saja menambahkan baris berikut ke tata letak tingkat atas dan semuanya berfungsi:

android:fitsSystemWindows="true"
Darush
sumber
@ yash786 mungkin menampilkan tombol di bawah teks edit yang menerima fokus? Pertanyaan kedua, bisakah Anda membagikan file tata letak atau menjawab saya bagaimana Anda menambahkan teks edit di bagian atas keybord?
Heroes84
ini berfungsi untuk saya acara tanpa android: windowSoftInputMode = "stateVisible | adjustResize"
zoom
0

Baiklah ini sudah sangat terlambat namun saya telah menemukan bahwa jika Anda menambahkan Tampilan Daftar di bawah teks edit Anda maka keyboard akan memindahkan semua tata letak di bawah teks editan itu tanpa memindahkan ListView

<EditText
android:id="@+id/et"
android:layout_height="match_parent"
android:layout_width="match_parent"



/>

<ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"//can make as 1dp
    android:layout_below="@+id/et" // set to below editext
    android:id="@+id/view"
    >
**<any layout**

Ini adalah satu-satunya solusi yang berhasil untuk saya.

Omar Boshra
sumber
0

Tidak ada satu saran pun yang menyelesaikan masalah saya. Sesuaikan Pan hampir sama seperti pekerjaan Sesuaikan Ubah Ukuran . Jika saya mengatur Adjust Nothing than layout tidak bergerak ke atas tetapi menyembunyikan teks editan saya dari bawah yang saya tulis dengan benar. Jadi setelah 24 jam pencarian terus menerus, saya menemukan sumber ini dan itu menyelesaikan masalah saya.

Mahbubur Rahman Khan
sumber
0

Mungkin terlambat tapi saya ingin menambahkan beberapa hal. Di Android Studio Versi 4.0.1, dan Gradle Versi 6.1.1, windowSoftInputMode ini tidak akan berfungsi seperti yang diharapkan jika Anda menambahkan tanda berikut dalam Aktivitas Anda:

getWindow().setFlags(
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
        );

Setelah membuang banyak waktu, saya menemukan peretasan itu. Agar adjustResizeatau AdjustPanatau atribut apa pun dari windowSoftInputModeberfungsi dengan baik, Anda harus menghapusnya dari aktivitas Anda.

Shehryar Aɱɩŋ
sumber