Cara menyesuaikan tata letak saat keyboard lunak muncul

164

Saya ingin menyesuaikan / mengatur ulang ukuran tata letak saat keyboard lunak diaktifkan, seperti di bawah ini:

Sebelum dan sesudah:

masukkan deskripsi gambar di sinimasukkan deskripsi gambar di sini


Menemukan beberapa sumber daya di SO:

  1. Cara menjaga agar semua bidang dan teks tetap terlihat saat keyboard lunak ditampilkan
  2. tata letak keyboard lunak Android merusak ketika muncul
  3. Sesuaikan tata letak saat keyboard lunak diaktifkan

Tetapi pertanyaan & jawabannya agak ambigu, inilah pertanyaan dengan gambaran yang lebih jelas tentang apa yang saya inginkan.

Persyaratan:

  • Ini harus berfungsi pada ponsel dengan ukuran layar apa pun.
  • Memperhatikan bahwa ruang margin / padding di "FACEBOOK" dan "Sign up for Facebook" telah berubah sebelum dan sesudah.
  • Tidak ada tampilan gulir yang terlibat.
Roy Lee
sumber
3
Perlu diingat juga bahwa pengubahan ukuran tidak bekerja di layar penuh ( Theme.AppCompat.Light.NoActionBar.FullScreen), sesuai jawaban ini -> stackoverflow.com/a/7509285/1307690
Roman Nazarevych

Jawaban:

202

Cukup tambahkan

android:windowSoftInputMode="adjustResize"

di AndroidManifest.xml tempat Anda mendeklarasikan aktivitas khusus ini dan ini akan menyesuaikan opsi ukuran tata letak.

masukkan deskripsi gambar di sini

beberapa kode sumber di bawah ini untuk desain tata letak

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="20dp"
        android:text="FaceBook"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView1"
        android:layout_marginTop="30dp"
        android:ems="10"
        android:hint="username" >

        <requestFocus />
    </EditText>

    <EditText
        android:id="@+id/editText2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/editText1"
        android:layout_marginTop="20dp"
        android:ems="10"
        android:hint="password" />

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/editText2"
        android:layout_centerHorizontal="true"
        android:layout_marginLeft="18dp"
        android:layout_marginTop="20dp"
        android:text="Log In" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginTop="17dp"
        android:gravity="center"
        android:text="Sign up for facebook"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</RelativeLayout>
Venkatesh S
sumber
2
+1 Sesederhana itu? Adakah ketentuan tambahan? Gambar apa yang Anda poskan?
Roy Lee
2
teman hanya untuk menunjukkan alignparentbottom = "true" jika layar tidak disesuaikan dengan benar ..telah saya menempatkan teman gambar itu
Venkatesh S
Jawaban yang sangat bagus. Terima kasih atas bantuannya, kawan. Senang kau datang.
Roy Lee
9
Teman sepertinya hanya TextView dengan "Daftar Facebook" yang disesuaikan sendiri ketika papan tombol diaktifkan, yang lain tetap tidak ada perubahan. Saya harap orang lain bisa menyesuaikan diri juga. Ada solusi? Dan seluruh tata letak harus berada di tengah sebelum keyboard diaktifkan,
Roy Lee
1
Apakah ada cara untuk memberikan beberapa bantalan tambahan saat melakukan penyesuaianResize? Saat ini ia mengubah ukuran sehingga bagian bawah kursor teks sejajar persis dengan bagian bawah layar. Saya ingin memiliki celah 5dp ekstra di bawah kursor teks terlihat.
Noitidart
39

Pertanyaan ini telah diajukan beberapa tahun yang lalu dan "Rahasia Andro Geni" memiliki penjelasan dasar yang baik dan "tir38" juga melakukan upaya yang baik untuk solusi lengkap, tetapi sayangnya tidak ada solusi lengkap yang diposting di sini. Saya telah menghabiskan beberapa jam untuk mencari tahu hal-hal dan inilah solusi lengkap saya dengan penjelasan terperinci di bagian bawah:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_above="@+id/mainLayout"
            android:layout_alignParentTop="true"
            android:id="@+id/headerLayout">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:gravity="center_horizontal">

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:id="@+id/textView1"
                    android:text="facebook"
                    android:textStyle="bold"
                    android:ellipsize="marquee"
                    android:singleLine="true"
                    android:textAppearance="?android:attr/textAppearanceLarge" />

            </LinearLayout>

        </RelativeLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:id="@+id/mainLayout"
            android:orientation="vertical">

            <EditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/editText1"
                android:ems="10"
                android:hint="Email or Phone"
                android:inputType="textVisiblePassword">

                <requestFocus />
            </EditText>

            <EditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:id="@+id/editText2"
                android:ems="10"
                android:hint="Password"
                android:inputType="textPassword" />

            <Button
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:id="@+id/button1"
                android:text="Log In"
                android:onClick="login" />

        </LinearLayout>

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_below="@+id/mainLayout"
            android:id="@+id/footerLayout">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true">

                <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content">

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:id="@+id/textView2"
                        android:text="Sign Up for Facebook"
                        android:layout_centerHorizontal="true"
                        android:layout_alignBottom="@+id/helpButton"
                        android:ellipsize="marquee"
                        android:singleLine="true"
                        android:textAppearance="?android:attr/textAppearanceSmall" />

                    <Button
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_alignParentRight="true"
                        android:id="@+id/helpButton"
                        android:text="\?"
                        android:onClick="help" />

                </RelativeLayout>

            </LinearLayout>

        </RelativeLayout>

    </RelativeLayout>

</ScrollView>

Dan di AndroidManifest.xml , jangan lupa atur:

android:windowSoftInputMode="adjustResize"

pada <activity>tag yang Anda inginkan tata letak seperti itu.

Pikiran:

Saya menyadari bahwa RelativeLayouttata letak yang membentang melalui semua ruang yang tersedia dan kemudian diubah ukurannya saat keyboard muncul.

Dan LinearLayouttata letak yang tidak diubah ukurannya dalam proses mengubah ukuran.

Itu sebabnya Anda perlu memiliki 1 RelativeLayoutsegera setelah ScrollViewspan melalui semua ruang layar yang tersedia. Dan Anda perlu memiliki bagian LinearLayoutdalam yang RelativeLayoutlain bagian dalam Anda akan hancur ketika ukurannya terjadi. Contoh yang bagus adalah "headerLayout". Jika tidak ada bagian LinearLayoutdalamnyaRelativeLayout teks "facebook" itu akan hancur dan tidak akan ditampilkan.

Dalam gambar masuk "facebook" yang diposting dalam pertanyaan, saya juga memperhatikan bahwa seluruh bagian login (mainLayout) berpusat vertikal dalam kaitannya dengan seluruh layar, karenanya atribut:

android:layout_centerVertical="true"

pada LinearLayouttata letak. Dan karena mainLayout ada di dalam LinearLayoutini berarti bagian itu tidak diubah ukurannya (lagi lihat gambar yang dipermasalahkan).

Yani2000
sumber
1
Bekerja seperti pesona !! tetapi footer menempel pada bagian bawah tata letak yang tidak terlihat bagus. bagaimana saya bisa menghindari footer stick ke bawah! sebagai gantinya jika saya ingin memberikan sedikit margin untuk footer sehingga tata letak terlihat bagus. Saya membuat beberapa perubahan dengan memberikan atribut layout_margin ke tata letak relatif dari footer tetapi dengan ini mencakup setengah terakhir dari Edit Text. Tolong bantu saya.
Tara
Dalam RelativeLayout dengan @ + id / footerLayout Anda memiliki LinearLayout yang memiliki atribut ini: android:layout_alignParentBottom="true". Ini membuatnya menempel ke bawah.
Yani2000
ya, perlu diingat bahwa, saya bertanya kepada Anda bagaimana melakukan pengaturan komponen footer yang harus memiliki margin bawah setidaknya 10dp atau 15dp
Tara
Saya tidak tahu apa yang Anda bicarakan. Saya baru saja menguji ini sendiri dengan memberikan android:layout_marginBottom="15dp"kepada footerLayout dan kemudian RelativeLayout yang memegang textView2 dan helpButton . Dalam kedua kasus, helpButton dihancurkan (bahkan tanpa atribut marginBottom). Tidak mungkin editText1 atau editText2 pernah dihancurkan, karena mereka ada di dalam LinearLayout . Apakah Anda mungkin menetapkan margin pada Layout lain (tidak hanya footerLayout )? Coba dari awal jika Anda tidak berhasil! Anda juga bisa bermain dengan android:windowSoftInputModeatribut di AndroidManifest.
Yani2000
1
"Dan LinearLayout adalah tata letak yang tidak diubah ukurannya dalam proses mengubah ukuran." - ini adalah informasi yang sangat membantu.
silinder
26

Tambahkan baris ini di Manifest Anda di mana Aktivitas Anda dipanggil

android:windowSoftInputMode="adjustPan|adjustResize"

atau

Anda dapat menambahkan baris ini di onCreate

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE|WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
Ashish Jaiswal
sumber
7
Anda seharusnya tidak pernah menggunakan keduanya adjustPandan adjustResize. Ini adalah mode yang berbeda. Baca lebih lanjut tentang mereka di sini: stackoverflow.com/a/17410528/1738090 Dan di sini: developer.android.com/guide/topics/manifest/activity-element
w3bshark
14

Pengembang Android memiliki jawaban yang tepat, tetapi kode sumber yang disediakan cukup bertele-tele dan tidak benar-benar menerapkan pola yang dijelaskan dalam diagram.

Ini templat yang lebih baik:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fillViewport="true">

    <RelativeLayout android:layout_width="match_parent"
                    android:layout_height="match_parent">

        <LinearLayout android:layout_width="match_parent"
                      android:layout_height="wrap_content"
                      android:orientation="vertical">

                <!-- stuff to scroll -->

        </LinearLayout>

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true">

            <!-- footer -->

        </FrameLayout>

    </RelativeLayout>

</ScrollView>

Terserah Anda untuk memutuskan tampilan apa yang Anda gunakan untuk bagian "scrolling" dan "footer". Juga tahu bahwa Anda mungkin harus mengatur ScrollViews fillViewPort .

tir38
sumber
Sudah mencoba mengikuti solusi Anda tetapi menggunakan dua LinearLayouts bukan Frame dan Relatif, tetapi semua tampilan masih di atas satu sama lain.
Henrique de Sousa
13

Ini dapat bekerja untuk semua jenis tata letak.

  1. tambahkan ini ke tag aktivitas Anda di AndroidManifest.xml

android: windowSoftInputMode = "AdjustResize"

sebagai contoh:

<activity android:name=".ActivityLogin"
    android:screenOrientation="portrait"
    android:theme="@style/AppThemeTransparent"
    android:windowSoftInputMode="adjustResize"/>
  1. tambahkan ini pada tag tata letak Anda di activitypage.xml yang akan mengubah posisinya.

android: fitsSystemWindows = "true"

dan

android: layout_alignParentBottom = "true"

sebagai contoh:

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:fitsSystemWindows="true">
pengguna3725137
sumber
Jawaban ini memberikan informasi yang lebih baik tentang cara membuat tata letak apa pun berfungsi.
Tim
8

Ini memungkinkan untuk menampilkan tata letak yang diinginkan yang sebelumnya disembunyikan oleh keyboard.

Tambahkan ini ke tag aktivitas di AndroidManifest.xml

android: windowSoftInputMode = "AdjustResize"


Kelilingi tampilan root Anda dengan ScrollView, lebih disukai dengan scrollbar = tidak ada. ScrollView dengan benar tidak akan mengubah apa pun dengan tata letak Anda kecuali digunakan untuk menyelesaikan masalah ini.

Dan kemudian atur fitsSystemWindows = "true" pada tampilan yang ingin Anda tampilkan sepenuhnya di atas keyboard. Ini akan membuat EditText Anda terlihat di atas keyboard, dan memungkinkan untuk menggulir ke bawah ke bagian-bagian di bawah EditText tetapi dalam tampilan dengan fitsSystemWindows = "true".

android: fitsSystemWindows = "true"

Sebagai contoh:

<ScrollView
    android:id="@+id/scrollView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="none">

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fitsSystemWindows="true">

        ...

    </android.support.constraint.ConstraintLayout>
</ScrollView>   

Jika Anda ingin menampilkan bagian penuh dari fitsSystemWindows = "true" tampilan di atas keyboard saat keyboard muncul, Anda akan memerlukan beberapa kode untuk menggulir tampilan ke bawah:

// Code is in Kotlin

setupKeyboardListener(scrollView) // call in OnCreate or similar


private fun setupKeyboardListener(view: View) {
    view.viewTreeObserver.addOnGlobalLayoutListener {
        val r = Rect()
        view.getWindowVisibleDisplayFrame(r)
        if (Math.abs(view.rootView.height - (r.bottom - r.top)) > 100) { // if more than 100 pixels, its probably a keyboard...
            onKeyboardShow()
        }
    }
}

private fun onKeyboardShow() {
    scrollView.scrollToBottomWithoutFocusChange()
}

fun ScrollView.scrollToBottomWithoutFocusChange() { // Kotlin extension to scrollView
    val lastChild = getChildAt(childCount - 1)
    val bottom = lastChild.bottom + paddingBottom
    val delta = bottom - (scrollY + height)
    smoothScrollBy(0, delta)
}

Contoh tata letak lengkap:

<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:fitsSystemWindows="true">

    <RelativeLayout
        android:id="@+id/statisticsLayout"
        android:layout_width="match_parent"
        android:layout_height="340dp"
        android:background="@drawable/some"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <ImageView
            android:id="@+id/logoImageView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="64dp"
            android:src="@drawable/some"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/authenticationLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginEnd="32dp"
        android:layout_marginStart="32dp"
        android:layout_marginTop="20dp"
        android:focusableInTouchMode="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/statisticsLayout">

        <android.support.design.widget.TextInputLayout
            android:id="@+id/usernameEditTextInputLayout"
            android:layout_width="match_parent"
            android:layout_height="68dp">

            <EditText
                android:id="@+id/usernameEditText"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

        </android.support.design.widget.TextInputLayout>

        <android.support.design.widget.TextInputLayout
            android:id="@+id/passwordEditTextInputLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/usernameEditTextInputLayout">

            <EditText
                android:id="@+id/passwordEditText"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

        </android.support.design.widget.TextInputLayout>

        <Button
            android:id="@+id/loginButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/passwordEditTextInputLayout"
            android:layout_centerHorizontal="true"
            android:layout_marginBottom="10dp"
            android:layout_marginTop="20dp" />

        <Button
            android:id="@+id/forgotPasswordButton"
            android:layout_width="wrap_content"
            android:layout_height="40dp"
            android:layout_below="@id/loginButton"
            android:layout_centerHorizontal="true" />

    </RelativeLayout>

</android.support.constraint.ConstraintLayout>

Morten Holmgaard
sumber
menggunakan android:fitsSystemWindows="true"adalah apa yang memberi saya hasil yang diinginkan yang saya inginkan ... terima kasih
CrandellWS
8

Bagi mereka yang menggunakan ConstraintLayout , android:windowSoftInputMode="adjustPan|adjustResize"tidak akan berfungsi.

Apa yang dapat Anda lakukan adalah menggunakan pendengar keyboard lunak , mengatur batasan tampilan dari bawah ke bawah tampilan atas, kemudian menetapkan bias vertikal untuk setiap tampilan (sebagai persentase posisi antar kendala) ke pedoman horizontal (juga diposisikan berdasarkan persentase , tetapi untuk orang tua).

Untuk setiap tampilan, kita hanya perlu perubahan app:layout_constraintBottom_toBottomOfuntuk @+id/guidelinesaat keyboard ditampilkan , pemrograman tentu saja.

        <ImageView
        android:id="@+id/loginLogo"
        ...
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.15" />


        <RelativeLayout
        android:id="@+id/loginFields"
        ...
        app:layout_constraintVertical_bias=".15"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/loginLogo">

        <Button
        android:id="@+id/login_btn"
        ...
        app:layout_constraintVertical_bias=".25"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/loginFields"/>

Umumnya keyboard lunak membutuhkan tidak lebih dari 50% dari ketinggian layar. Dengan demikian, Anda dapat menetapkan pedoman pada 0,5.

        <android.support.constraint.Guideline
        android:id="@+id/guideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.5"/>

Sekarang secara pemrograman, ketika keyboard tidak ditampilkan , kita dapat mengatur semua app:layout_constraintBottom_toBottomOfkembali ke induk, sebaliknya.

            unregistrar = KeyboardVisibilityEvent.registerEventListener(this, isOpen -> {
            loginLayout.startAnimation(AnimationManager.getFade(200));
            if (isOpen) {
                setSoftKeyViewParams(loginLogo, R.id.guideline, ConstraintLayout.LayoutParams.PARENT_ID, -1, "235:64", 0.15f,
                        63, 0, 63, 0);
                setSoftKeyViewParams(loginFields, R.id.guideline, -1, R.id.loginLogo, null, 0.15f,
                        32, 0, 32, 0);
                setSoftKeyViewParams(loginBtn, R.id.guideline, -1, R.id.useFingerPrintIdText, null, 0.5f,
                        32, 0, 32, 0);
            } else {
                setSoftKeyViewParams(loginLogo, ConstraintLayout.LayoutParams.PARENT_ID, ConstraintLayout.LayoutParams.PARENT_ID, -1, "235:64", 0.15f,
                        63, 0, 63, 0);
                setSoftKeyViewParams(loginFields, ConstraintLayout.LayoutParams.PARENT_ID, -1, R.id.loginLogo,null, 0.15f,
                        32, 0, 32, 0);
                setSoftKeyViewParams(loginBtn, ConstraintLayout.LayoutParams.PARENT_ID, -1, R.id.useFingerPrintIdText,null, 0.25f,
                        32, 0, 32, 0);
            }
        });

Panggil metode ini:

    private void setSoftKeyViewParams(View view, int bottomToBottom, int topToTop, int topToBottom, String ratio, float verticalBias,
                                  int left, int top, int right, int bottom) {
    ConstraintLayout.LayoutParams viewParams = new ConstraintLayout.LayoutParams(view.getLayoutParams().width, view.getLayoutParams().height);
    viewParams.dimensionRatio = ratio;
    viewParams.bottomToBottom = bottomToBottom;
    viewParams.topToTop = topToTop;
    viewParams.topToBottom = topToBottom;
    viewParams.endToEnd = ConstraintLayout.LayoutParams.PARENT_ID;
    viewParams.startToStart = ConstraintLayout.LayoutParams.PARENT_ID;
    viewParams.verticalBias = verticalBias;
    viewParams.setMargins(Dimensions.dpToPx(left), Dimensions.dpToPx(top), Dimensions.dpToPx(right), Dimensions.dpToPx(bottom));
    view.setLayoutParams(viewParams);
}

Yang penting adalah memastikan untuk mengatur bias vertikal dengan cara yang akan skala dengan benar ketika keyboard ditampilkan dan tidak ditampilkan.

6rchid
sumber
2
Metode yang lebih sederhana adalah dengan membungkus ConstraintLayout di dalam ScrollView atau NestedScrollView. Perhitungan akhirnya menjadi terlalu banyak pekerjaan. Tetapi jawaban Anda bagus jika ScrollView akan berakhir menyebabkan masalah lain
Devenom
5

Banyak jawaban yang benar. Dalam AndroidManifestaku menulis:

<activity
    android:name=".SomeActivity"
    android:configChanges="orientation|keyboardHidden|screenSize" // Optional, doesn't affect.
    android:theme="@style/AppTheme.NoActionBar"
    android:windowSoftInputMode="adjustResize" />

Dalam kasus saya, saya menambahkan tema styles.xml, tetapi Anda dapat menggunakan tema Anda sendiri:

<style name="AppTheme.NoActionBar" parent="AppTheme">
    <!--  Hide ActionBar -->
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
</style>

Saya mengetahui bahwa jika saya menggunakan tema layar penuh, pengubahan ukuran tidak terjadi:

<style name="AppTheme.FullScreenTheme" parent="AppTheme">
    <!--  Hide ActionBar -->
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <!--  Hide StatusBar -->
    <item name="android:windowFullscreen">true</item>
</style>

Juga dalam kasus saya adjustResizeberfungsi, tetapiadjustPan tidak.

Untuk tata letak layar penuh lihat solusinya di Android Cara menyesuaikan tata letak dalam Mode Layar Penuh ketika papan tombol terlihat atau di https://gist.github.com/grennis/2e3cd5f7a9238c59861015ce0a7c5584 .

Juga https://medium.com/@sandeeptengale/problem-solved-3-android-full-screen-view-translucent-scrollview-adjustresize-keyboard-b0547c7ced32 berfungsi, tetapi StatusBar transparan, jadi baterai, jam, Wi- Ikon Fi terlihat.

Jika Anda membuat aktivitas dengan File> Baru> Aktivitas> Aktivitas Layar Penuh, di mana dalam kode digunakan:

fullscreen_content.systemUiVisibility =
    View.SYSTEM_UI_FLAG_LOW_PROFILE or
    View.SYSTEM_UI_FLAG_FULLSCREEN or
    View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
    View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY or
    View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or
    View.SYSTEM_UI_FLAG_HIDE_NAVIGATION

Anda juga tidak akan mencapai hasil. Anda dapat menggunakan android:fitsSystemWindows="true"wadah root, tetapi StatusBar muncul. Jadi gunakan solusi dari tautan pertama.

CoolMind
sumber
@Harshilkakadiya, terima kasih! Perhatikan, bahwa jika Anda ingin kembali ke mode normal (non-layar penuh), solusi ini harus dihapus. Saya menghabiskan banyak waktu untuk itu. Dalam kasus saya di bawah tata letak saya mendapat ruang putih. Semoga berhasil!
CoolMind
2

Dalam kasus saya itu membantu.

main_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="com.livewallpaper.profileview.loginact.Main2Activity">

<TextView
    android:layout_weight="1"
    android:layout_width="match_parent"
    android:text="Title"
    android:gravity="center"
    android:layout_height="0dp" />
<LinearLayout
    android:layout_weight="1"
    android:layout_width="match_parent"
    android:layout_height="0dp">
    <EditText
        android:hint="enter here"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>
<TextView
    android:layout_weight="1"
    android:text="signup for App"
    android:gravity="bottom|center_horizontal"
    android:layout_width="match_parent"
    android:layout_height="0dp" />
</LinearLayout>

Gunakan ini dalam manifestfile

<activity android:name=".MainActivity"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="adjustResize"/>

Sekarang bagian terpenting! Gunakan tema seperti ini di tag Activityatau Application.

android:theme="@style/AppTheme"

Dan temanya mengambil seperti ini

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="windowActionModeOverlay">true</item>
</style>

Jadi saya kehilangan temanya. Yang membuat saya frustrasi sepanjang hari.

Pradeep Kumar Kushwaha
sumber
2

Anda cukup mengatur opsi ini di file AndroidManifest.xml.

<activity
    android:name=".YourACtivityName"
    android:windowSoftInputMode="stateVisible|adjustResize">

Penggunaan adjustPantidak direkomendasikan oleh Google karena pengguna mungkin perlu menutup keyboard untuk melihat semua kolom input.

Info lebih lanjut: Manifes Aplikasi Android

vovahost
sumber
2

Bagi saya ini bekerja dengan baris kode ini:

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

Masukkan saja ke metode onCreate. Terbaik!

Peter94
sumber
1
Sementara ini secara teoritis dapat menjawab pertanyaan, akan lebih baik untuk juga menjelaskan mengapa ini berhasil.
Clinomaniac
2

Tambahkan baris ini ke File Manifiest:

android:windowSoftInputMode="adjustResize"
Pengecualian Null Pointer
sumber
1

Saya menggunakan bingkai kelas Extended ini dan ketika saya perlu menghitung ulang ukuran tinggi diLayout saya menimpa pengukuran dan mengurangi keyboardHeight menggunakan getKeyboardHeight ()

Saya membuat bingkai yang perlu diubah ukurannya dengan papan tombol softkey

SizeNotifierFrameLayout frameLayout = new SizeNotifierFrameLayout(context) {
            private boolean first = true;

            @Override
            protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
                super.onLayout(changed, left, top, right, bottom);

                if (changed) {
                    fixLayoutInternal(first);
                    first = false;
                }
            }

            @Override
            protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
                super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(heightMeasureSpec) - getKeyboardHeight(), MeasureSpec.EXACTLY));
            }

            @Override
            protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
                boolean result = super.drawChild(canvas, child, drawingTime);
                if (child == actionBar) {
                    parentLayout.drawHeaderShadow(canvas, actionBar.getMeasuredHeight());
                }
                return result;
            }


        };

SizeNotifierFrameLayout

public class SizeNotifierFrameLayout extends FrameLayout {

    public interface SizeNotifierFrameLayoutDelegate {
        void onSizeChanged(int keyboardHeight, boolean isWidthGreater);
    }

    private Rect                            rect            = new Rect();
    private Drawable                        backgroundDrawable;
    private int                             keyboardHeight;
    private int                             bottomClip;
    private SizeNotifierFrameLayoutDelegate delegate;
    private boolean                         occupyStatusBar = true;

    public SizeNotifierFrameLayout(Context context) {
        super(context);
        setWillNotDraw(false);
    }

    public Drawable getBackgroundImage() {
        return backgroundDrawable;
    }

    public void setBackgroundImage(Drawable bitmap) {
        backgroundDrawable = bitmap;
        invalidate();
    }

    public int getKeyboardHeight() {
        View rootView = getRootView();
        getWindowVisibleDisplayFrame(rect);
        int usableViewHeight = rootView.getHeight() - (rect.top != 0 ? AndroidUtilities.statusBarHeight : 0) - AndroidUtilities.getViewInset(rootView);
        return usableViewHeight - (rect.bottom - rect.top);
    }

    public void notifyHeightChanged() {
        if (delegate != null) {
            keyboardHeight = getKeyboardHeight();
            final boolean isWidthGreater = AndroidUtilities.displaySize.x > AndroidUtilities.displaySize.y;
            post(new Runnable() {
                @Override
                public void run() {
                    if (delegate != null) {
                        delegate.onSizeChanged(keyboardHeight, isWidthGreater);
                    }
                }
            });
        }
    }

    public void setBottomClip(int value) {
        bottomClip = value;
    }

    public void setDelegate(SizeNotifierFrameLayoutDelegate delegate) {
        this.delegate = delegate;
    }

    public void setOccupyStatusBar(boolean value) {
        occupyStatusBar = value;
    }

    protected boolean isActionBarVisible() {
        return true;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        if (backgroundDrawable != null) {
            if (backgroundDrawable instanceof ColorDrawable) {
                if (bottomClip != 0) {
                    canvas.save();
                    canvas.clipRect(0, 0, getMeasuredWidth(), getMeasuredHeight() - bottomClip);
                }
                backgroundDrawable.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight());
                backgroundDrawable.draw(canvas);
                if (bottomClip != 0) {
                    canvas.restore();
                }
            } else if (backgroundDrawable instanceof BitmapDrawable) {
                BitmapDrawable bitmapDrawable = (BitmapDrawable) backgroundDrawable;
                if (bitmapDrawable.getTileModeX() == Shader.TileMode.REPEAT) {
                    canvas.save();
                    float scale = 2.0f / AndroidUtilities.density;
                    canvas.scale(scale, scale);
                    backgroundDrawable.setBounds(0, 0, (int) Math.ceil(getMeasuredWidth() / scale), (int) Math.ceil(getMeasuredHeight() / scale));
                    backgroundDrawable.draw(canvas);
                    canvas.restore();
                } else {
                    int actionBarHeight =
                            (isActionBarVisible() ? ActionBar.getCurrentActionBarHeight() : 0) + (Build.VERSION.SDK_INT >= 21 && occupyStatusBar ? AndroidUtilities.statusBarHeight : 0);
                    int   viewHeight = getMeasuredHeight() - actionBarHeight;
                    float scaleX     = (float) getMeasuredWidth() / (float) backgroundDrawable.getIntrinsicWidth();
                    float scaleY     = (float) (viewHeight + keyboardHeight) / (float) backgroundDrawable.getIntrinsicHeight();
                    float scale      = scaleX < scaleY ? scaleY : scaleX;
                    int   width      = (int) Math.ceil(backgroundDrawable.getIntrinsicWidth() * scale);
                    int   height     = (int) Math.ceil(backgroundDrawable.getIntrinsicHeight() * scale);
                    int   x          = (getMeasuredWidth() - width) / 2;
                    int   y          = (viewHeight - height + keyboardHeight) / 2 + actionBarHeight;
                    canvas.save();
                    canvas.clipRect(0, actionBarHeight, width, getMeasuredHeight() - bottomClip);
                    backgroundDrawable.setBounds(x, y, x + width, y + height);
                    backgroundDrawable.draw(canvas);
                    canvas.restore();
                }
            }
        } else {
            super.onDraw(canvas);
        }
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        notifyHeightChanged();
    }
}
Arthur Melo
sumber
0

Kode ini berfungsi untuk saya. Saat keyboard muncul, Anda dapat menggulir layar

Di AndroidManifest.xml

<activity android:name=".signup.screen_2.SignUpNameAndPasswordActivity"
                  android:screenOrientation="portrait"
                  android:windowSoftInputMode="adjustResize">
</activity>

activity_sign_up.xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true"
        tools:context=".signup.screen_2.SignUpNameAndPasswordActivity">
    <LinearLayout
            android:fitsSystemWindows="true"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

        <LinearLayout
                android:layout_marginTop="@dimen/dp_24"
                android:layout_marginStart="@dimen/dp_24"
                android:layout_marginEnd="@dimen/dp_24"
                android:id="@+id/lin_name_password"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">

            <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_horizontal"
                    android:fontFamily="sans-serif-medium"
                    android:text="@string/name_and_password"
                    android:textColor="@color/colorBlack"
                    android:layout_marginTop="@dimen/dp_5"
                    android:textSize="@dimen/ts_16"/>

            <EditText
                    android:id="@+id/edit_full_name"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/dp_44"
                    app:layout_constraintTop_toTopOf="parent"
                    android:hint="@string/email_address_hint"
                    android:inputType="textPersonName"
                    android:imeOptions="flagNoFullscreen"
                    android:textSize="@dimen/ts_15"
                    android:background="@drawable/rounded_border_edittext"
                    android:layout_marginTop="@dimen/dp_15"
                    android:paddingStart="@dimen/dp_8"
                    android:paddingEnd="@dimen/dp_8"
                    android:maxLength="100"
                    android:maxLines="1"/>

            <EditText
                    android:id="@+id/edit_password"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/dp_44"
                    app:layout_constraintTop_toTopOf="parent"
                    android:hint="@string/password"
                    android:inputType="textPassword"
                    android:imeOptions="flagNoFullscreen"
                    android:textSize="@dimen/ts_15"
                    android:background="@drawable/rounded_border_edittext"
                    android:layout_marginTop="@dimen/dp_15"
                    android:paddingStart="@dimen/dp_8"
                    android:paddingEnd="@dimen/dp_8"
                    android:maxLength="100"
                    android:maxLines="1"/>

            <TextView
                    android:id="@+id/btn_continue_and_sync_contacts"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/dp_44"
                    android:gravity="center"
                    android:clickable="true"
                    android:focusable="true"
                    android:layout_marginTop="@dimen/dp_15"
                    android:background="@drawable/btn_blue_selector"
                    android:enabled="false"
                    android:text="@string/continue_and_sync_contacts"
                    android:textColor="@color/colorWhite"
                    android:textSize="@dimen/ts_15"
                    android:textStyle="bold"/>

            <TextView
                    android:id="@+id/btn_continue_without_syncing_contacts"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/dp_44"
                    android:gravity="center"
                    android:clickable="true"
                    android:focusable="true"
                    android:layout_marginTop="@dimen/dp_10"
                    android:enabled="false"
                    android:text="@string/continue_without_syncing_contacts"
                    android:textColor="@color/colorBlue"
                    android:textSize="@dimen/ts_15"
                    android:textStyle="bold"/>

        </LinearLayout>
        <!--RelativeLayout is scaled when keyboard appears-->
        <RelativeLayout
                android:layout_marginStart="@dimen/dp_24"
                android:layout_marginEnd="@dimen/dp_24"
                android:layout_marginBottom="@dimen/dp_20"
                android:layout_width="match_parent"
                android:layout_height="match_parent">

            <LinearLayout
                    android:layout_alignParentBottom="true"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical">
                <TextView
                        android:id="@+id/tv_learn_more_1"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:clickable="true"
                        android:focusable="true"
                        android:layout_gravity="center_horizontal"
                        android:text="@string/learn_more_syncing_contacts"
                        android:textColor="@color/black_alpha_70"
                        android:gravity="center"
                        android:layout_marginBottom="1dp"
                        android:textSize="@dimen/ts_13"/>

                <TextView
                        android:id="@+id/tv_learn_more_2"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:clickable="true"
                        android:focusable="true"
                        android:layout_gravity="center_horizontal"
                        android:text="@string/learn_more"
                        android:fontFamily="sans-serif-medium"
                        android:textColor="@color/black_alpha_70"
                        android:textSize="@dimen/ts_13"/>
            </LinearLayout>
        </RelativeLayout>
    </LinearLayout>
</ScrollView>

rounded_border_edittext.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_activated="true">
        <shape android:shape="rectangle">
            <solid android:color="#F6F6F6"/>
            <corners android:radius="3dp"/>
            <stroke
                    android:width="1dp"
                    android:color="@color/red"/>
        </shape>
    </item>
    <item android:state_activated="false">
        <shape android:shape="rectangle">
            <solid android:color="#F6F6F6"/>
            <corners android:radius="3dp"/>
            <stroke
                    android:width="1dp"
                    android:color="@color/colorGray"/>
        </shape>
    </item>
</selector>

btn_blue_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="true" android:state_pressed="true">
        <shape android:shape="rectangle">
            <corners android:radius="3dp"/>
            <solid android:color="@color/colorBlueLight"/>
            <stroke android:width="1dp" android:color="@color/colorBlueLight"/>
        </shape>
    </item>
    <item android:state_enabled="true">
        <shape android:shape="rectangle">
            <corners android:radius="3dp"/>
            <solid android:color="@color/colorBlue"/>
            <stroke android:width="1dp" android:color="@color/colorBlue"/>
        </shape>
    </item>
    <item android:state_enabled="false">
        <shape android:shape="rectangle">
            <corners android:radius="3dp"/>
            <solid android:color="@color/colorBlueAlpha"/>
            <stroke android:width="0dp" android:color="@color/colorBlueAlpha"/>
        </shape>
    </item>
</selector>
Anh Duy
sumber
0

Di Xamarin daftarkan kode di bawah ini dalam aktivitas Anda

 WindowSoftInputMode = Android.Views.SoftInput.AdjustResize | Android.Views.SoftInput.AdjustPan

Saya menggunakan Layout Relatif jika Anda menggunakan Constraint Layout, kode di atas akan berfungsi sebagai kode di bawah ini

logeshpalani98
sumber