Yazılım klavyesi göründüğünde mizanpaj nasıl ayarlanır?


164

Yazılım klavyesi etkinleştirildiğinde aşağıdaki gibi düzeni ayarlamak / yeniden boyutlandırmak istiyorum:

Önce ve sonra:

resim açıklamasını buraya girinresim açıklamasını buraya girin


SO'da bulunan iki kaynak bulundu:

  1. Yazılım klavyesi gösterilirken tüm alanların ve metinlerin görünür tutulması
  2. göründüğünde android yumuşak klavye düzeni bozar
  3. Yazılım klavyesi açıkken düzeni ayarlama

Ama sorular ve cevaplar oldukça belirsiz, işte ne istediğimi daha net bir şekilde gösteren soru.

Gereksinimler:

  • Herhangi bir ekran boyutuna sahip telefonda çalışmalıdır.
  • "FACEBOOK" ve "Facebook'a Kaydolun" daki kenar boşluğu / dolgu alanının önce ve sonra değiştiğini fark ettim.
  • Kaydırma görünümü yok.

3
Theme.AppCompat.Light.NoActionBar.FullScreenBu yanıta göre yeniden boyutlandırma işleminin tam ekranda ( ) çalışmadığını da hatırlamakta
fayda var

Yanıtlar:


202

Sadece ekle

android:windowSoftInputMode="adjustResize"

AndroidManifest.xml dosyasında bu özel etkinliği bildirdiğinizde düzen yeniden boyutlandırma seçeneği ayarlanır.

resim açıklamasını buraya girin

düzen tasarımı için aşağıdaki bazı kaynak kodu

<?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>

2
+1 Bu kadar basit mi? Ekstra koşullar var mı? Gönderdiğiniz görüntü neydi?
Roy Lee

2
arkadaşlar sadece ekran doğru ayarlanmamışsa alignparentbottom = "true" göstermek için .. bu nedenle ben bu görüntü arkadaş yerleştirdi
Venkatesh S

Gerçekten çok iyi bir cevap. Yardımın için teşekkürler dostum. Gelmene sevindim.
Roy Lee

9
Arkadaşım sadece "facebook için kaydol" ile TextView yazılım tuş takımı etkinleştirildiğinde kendini ayarlamış gibi görünüyor, diğerleri hiçbir değişiklik olmayacak. Umarım başkaları da uyum sağlar. Herhangi bir çözüm var mı? Ve tüm düzen klavye etkinleştirilmeden önce merkezde olmalı,
Roy Lee

1
AdjustResize yaptığında fazladan dolgu vermenin bir yolu var mı? Şu anda yeniden boyutlandırılıyor, böylece metin imlecinin altı TAMAMEN ekranın altıyla hizalanıyor. Metin imlecinin altında fazladan 5 dp boşluk olmasını istiyorum.
Noitidart

39

Bu soru birkaç yıl önce soruldu ve "Secret Andro Geni" nin iyi bir temel açıklaması var ve "tir38" de tam çözüm üzerinde iyi bir girişimde bulundu, ancak ne yazık ki burada tam bir çözüm yok. Bir şeyleri anlamak için birkaç saat harcadım ve işte tam çözümüm aşağıda ayrıntılı bir açıklama ile:

<?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>

Ve AndroidManifest.xml'de şunları ayarlamayı unutmayın:

android:windowSoftInputMode="adjustResize"

üzerinde <activity>etiketinin Böyle bir düzen istiyorum.

Düşünceler:

Bunun RelativeLayouttüm kullanılabilir alanı kapsayan düzenler olduğunu fark ettim ve daha sonra klavye açıldığında yeniden boyutlandırıldı.

Ve LinearLayoutyeniden boyutlandırma sürecinde yeniden boyutlandırılmayan düzenlerdir.

Bu nedenle, kullanılabilir tüm ekran alanına yayıldıktan RelativeLayouthemen sonra 1 tane olması gerekir ScrollView. Ve eğer bir olması gerekir LinearLayoutbir iç RelativeLayoutyeniden boyutlandırma gerçekleştiğinde başka içinize ezilecek olacaktır. İyi bir örnek "headerLayout". Eğer içeride olmazsa LinearLayouto RelativeLayout"facebook" metni ezilirdi ve gösterilmezdi.

Soruda yayınlanan "facebook" giriş resimlerinde de tüm giriş bölümünün (mainLayout) tüm ekrana göre dikey olarak ortalandığını fark ettim, dolayısıyla özellik:

android:layout_centerVertical="true"

üzerinde LinearLayoutdüzeni. MainLayout bir içeride LinearLayoutolduğu için bu bölüm yeniden boyutlandırılmaz (yine söz konusu resme bakın).


1
Tıkır tıkır çalışıyor!! ancak altbilgi, hoş görünmeyen düzenin altına yapışır. altbilgi çubuğunu nasıl önleyebilirim! bunun yerine altbilgiye bir miktar marj vermek istersem, böylece düzen iyi görünür. Altbilginin göreli düzenine layout_margin niteliği vererek bazı değişiklikler yaptım, ancak bununla Metni Düzenle'nin son yarısını kapsıyor. Plz bana yardım et.
Tara

In RelativeLayout ile + kimliği / footerLayout bir var LinearLayout bu özniteliği vardır: android:layout_alignParentBottom="true". Bu, dibe yapışmasını sağlar.
Yani2000

ya da, alt kenar boşluğu en az 10dp veya 15dp olması gereken altbilgi bileşenlerinin düzenlemelerini nasıl yapacağınızı sordum
Tara,

Ne hakkında konuştuğun hakkında hiçbir fikrim yok. Sadece vererek bu kendimi test android:layout_marginBottom="15dp"etmek footerLayout sonra ve RelativeLayout düzenliyor textView2 ve helpButton . Her iki durumda da helpButton ezilir (marginBottom özniteliği olmasa bile). Hiçbir şekilde editText1 veya editText2 ezilmez , çünkü onlar bir LinearLayout'un içindedir . Belki başka bir Layout'ta marj ayarladınız mı (sadece footerLayout değil )? Hiçbir yere gitmiyorsanız sıfırdan deneyin! android:windowSoftInputModeAndroidManifest'te özellik ile de oynayabilirsiniz .
Yani2000

1
"Ve LinearLayout, yeniden boyutlandırma sürecinde yeniden boyutlandırılmayan düzenlerdir." - bu gerçekten yararlı bir bilgi.
slon

26

Bu satırı Manifest'inize Faaliyetinizin çağrıldığı yere ekleyin

android:windowSoftInputMode="adjustPan|adjustResize"

veya

bu satırı onCreate

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

7
Her iki kullanmak asla adjustPanve adjustResize. Bunlar farklı modlardır. Onlar hakkında daha fazla bilgiyi buradan edinebilirsiniz: stackoverflow.com/a/17410528/1738090 Ve burada: developer.android.com/guide/topics/manifest/activity-element
w3bshark

14

Android Geliştirici doğru cevaba sahiptir, ancak sağlanan kaynak kodu oldukça ayrıntılıdır ve gerçekte şemada açıklanan modeli uygulamamaktadır.

İşte daha iyi bir şablon:

<?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>

"Kaydırma" ve "altbilgi" bölümleri için hangi görünümleri kullandığınıza karar vermek size kalmıştır. Ayrıca muhtemelen ScrollViews fillViewPort ayarlamanız gerektiğini biliyorum .


Çözümünüzü takip LinearLayoutetmeyi denedim , ancak Çerçeve ve Göreli yerine iki s kullanın, ancak tüm görünümler hala birbirinin üstünde.
Henrique de Sousa

13

Her türlü düzen için çalışabilir.

  1. bunu AndroidManifest.xml'deki etkinlik etiketinize ekleyin

android: windowSoftInputMode = "adjustResize"

Örneğin:

<activity android:name=".ActivityLogin"
    android:screenOrientation="portrait"
    android:theme="@style/AppThemeTransparent"
    android:windowSoftInputMode="adjustResize"/>
  1. bunu etkinlik sayfasını değiştirecek olan eventpage.xml dosyasındaki yerleşim etiketinize ekleyin .

android: fitsSystemWindows = "true"

ve

android: layout_alignParentBottom = "true"

Örneğin:

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

Bu cevap, herhangi bir mizanpajın nasıl yapılacağı hakkında daha iyi bilgi sağlar.
Tim

9

Bu, klavye tarafından daha önce gizlenmiş herhangi bir düzeni göstermeyi mümkün kılar.

Bunu AndroidManifest.xml'deki etkinlik etiketine ekle

android: windowSoftInputMode = "adjustResize"


Kök görünümünüzü ScrollView, tercihen scrollbars = none ile çevreleyin. ScrollView, bu sorunu çözmek için kullanılması dışında, düzeninizle ilgili hiçbir şeyi düzgün bir şekilde değiştirmeyecektir.

Ardından, klavyenin üzerinde tam olarak gösterilmesini istediğiniz görünümde fitsSystemWindows = "true" değerini ayarlayın. Bu, EditText'inizi klavyenin üzerinde görünür hale getirir ve EditText'in altındaki bölümlere ancak fitsSystemWindows = "true" görünümünde aşağı kaydırmayı mümkün kılar.

android: fitsSystemWindows = "true"

Örneğin:

<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>   

Klavyenin göründüğü anda fitsSystemWindows = "true" görünümünün tam kısmını göstermek istiyorsanız, görünümü en alta kaydırmak için bir koda ihtiyacınız olacaktır:

// 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)
}

Tam düzen örneği:

<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>


kullanarak android:fitsSystemWindows="true"bana istediğim sonuçları verdi ... teşekkürler
CrandellWS

8

Kullananlar için ConstraintLayout , android:windowSoftInputMode="adjustPan|adjustResize"çalışmaz.

Yapabileceğiniz şey, yumuşak bir klavye dinleyici kullanmak , görünümlerin kısıtlamalarını üst görünümlerin altından altına doğru ayarlamak, ardından her görünüm için (kısıtlamalar arasında konumsal bir yüzde olarak) yatay bir kılavuza (yüzde olarak da konumlandırılmış) dikey bir sapma ayarlamaktır. , ancak ebeveyne).

Her görünüm için, sadece değişime ihtiyaç app:layout_constraintBottom_toBottomOfiçin @+id/guidelineklavye olduğunda gösterilir programlı elbette.

        <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"/>

Genellikle yumuşak bir klavye ekran yüksekliğinin en fazla% 50'sini kaplar. Böylece, kılavuzu 0,5 olarak ayarlayabilirsiniz.

        <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"/>

Şimdi programlı olarak, klavye gösterilmediğinde , tüm app:layout_constraintBottom_toBottomOfarka kısmı üste veya tam tersine ayarlayabiliriz .

            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);
            }
        });

Bu yöntemi çağırın:

    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);
}

Önemli olan, klavyenin gösterilip gösterilmemesi durumunda dikey sapmanın doğru şekilde ölçeklenecek şekilde ayarlandığından emin olmaktır.


2
Daha basit bir yöntem, ConstraintLayout'u bir ScrollView veya NestedScrollView içine sarmaktır. Hesaplamalar sonuçta çok fazla iş çıkarıyor. Ancak bir ScrollView başka sorunlara neden olursa cevabınız harika
Devenom

5

Birçok cevap doğrudur. In AndroidManifestyazdım:

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

Benim durumumda bir tema ekledim styles.xml, ancak kendi temanızı kullanabilirsiniz:

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

Tam ekran teması kullanırsam yeniden boyutlandırma gerçekleşmediğini fark ettim:

<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>

Ayrıca benim durumumda adjustResizeçalışıyor, ama adjustPançalışmıyor.

İçin tam ekran düzenleri bir geçici çözüm bakın SoftKeyboard görünür olduğunda Tam Ekran Modu düzeni nasıl ayarlanır Android veya https://gist.github.com/grennis/2e3cd5f7a9238c59861015ce0a7c5584 .

Ayrıca https://medium.com/@sandeeptengale/problem-solved-3-android-full-screen-view-translucent-scrollview-adjustresize-keyboard-b0547c7ced32 çalışıyor, ancak StatusBar şeffaf, pil, saat, Wi- Fi simgeleri görülebilir.

Kodda kullanılan Dosya> Yeni> Etkinlik> Tam Ekran Etkinliği ile bir etkinlik oluşturursanız:

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

ayrıca bir sonuç elde edemezsiniz. android:fitsSystemWindows="true"Bir kök kapsayıcısında kullanabilirsiniz , ancak StatusBar görüntülenir. Bu yüzden ilk bağlantıdan geçici çözümler kullanın.


@Harshilkakadiya, teşekkürler! Daha sonra normal moda (tam ekran olmayan) dönmek isterseniz, bu geçici çözümün kaldırılması gerektiğini unutmayın. Üzerinde uzun saatler harcadım. Benim durumumda mizanpajın altında beyaz bir alan var. İyi şanslar!
CoolMind

2

Benim durumumda yardımcı oldu.

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>

Bunu manifestdosyada kullan

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

Şimdi en önemli kısım! Ya Activityda Applicationetiketinde böyle bir tema kullanın .

android:theme="@style/AppTheme"

Ve tema böyle görünüyor

<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>

Bu yüzden temayı kaçırıyordum. Bu da beni bütün gün hayal kırıklığına uğrattı.


2

Bu seçenekleri AndroidManifest.xml dosyasında kolayca ayarlayabilirsiniz.

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

adjustPanKullanıcının tüm giriş alanlarını görmek için klavyeyi kapatması gerekebileceğinden, Google tarafından kullanılması önerilmez.

Daha fazla bilgi: Android Uygulama Bildirimi


2

Benim için bu kod satırı ile çalıştı:

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

Sadece onCreate yöntemine koyun. En iyi!


1
Bu teorik olarak soruyu cevaplayabilirken, bunun neden işe yaradığını da açıklamak tercih edilir.
clinomaniac


1

Bu Genişletilmiş sınıf çerçevesini kullanırım

Yazılım klavyesiyle yeniden boyutlandırılması gereken çerçeve oluştur

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();
    }
}

0

Bu kod benim için çalışıyor. Klavye göründüğünde, ekranı kaydırabilirsiniz

AndroidManifest.xml'de

<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>

0

Xamarin'de faaliyetinizde kodun altına kaydolun

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

Kısıtlama Düzeni kullanıyorsanız Göreli Düzen kullandım, yukarıdaki kod aşağıdaki kodu çalıştıracaktır

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.