"EditResize" yumshoq klaviatura harakati va holat satrining orqasida joylashgan asboblar paneli bir vaqtning o'zida bo'lishi mumkinmi?

Android ilovamda dasturiy ta'minot uchun adjustResize funksiyasidan foydalanish juda muhimdir. Shunday qilib, foydalanuvchilar "davom ettirish" tugmasi kabi boshqa UI elementlariga o'tishlari mumkin.

adjustResize faqat manifest sozlamasi va android: fitsSystemWindows = "rost" bo'lsa, faqat tartib root elementida ishlayotganini tushunib etdim. (Agar men xato qilsam, iltimos meni to'g'rilang!)

Lekin android: fitsSystemWindows = "rost" yordamida asboblar paneli endi Status panelining orqasida o'tirilmaydi. Qaysi ma'noda mukammal, lekin men istaganim emas.

Asboblar paneli orqasida o'tirganida, holat paneli asboblar panelidagi rangning mos keladigan quyuq soyasiga ega. android bilan nima bor: fitsSystemWindows = "rost" rangsiz holat paneli va men istaganimdan 24dp pastroq bo'lgan asboblar paneli.

adjustResize klaviatura xatti uchun mos rangli vaziyat panelidan voz kechamiz. Lekin mening savolim ikkalasiga ham ega bo'lishi mumkinmi? Go'zallik va qulayliklar uchun orzu qilamanmi?

Tajribali har bir kishi sozlamalarning sehrli kombinatsiyasini biladimi? Yoki, ehtimol, atrofdagilarning ishi sifatida, vaziyat panelini aniq rangga aylantirishning bir yo'li?

fyi:

Bunga RelativeLayout ildiz elementlari bo'lgan amallar kiradi va ulardan ba'zilari ListView va EditText bor.

Toolbar is android.support.v7.widget.Toolbar

Potentsial ravishda tegishli uslublar:

12
Men ham xuddi shu muammoga duch keldim, holat satrini rang berishni nazarda tutmaydigan echim topdingizmi (men statusbarning orqasida chizishga harakat qilaman, bu qattiq rang emas)
qo'shib qo'ydi muallif feresr, manba
Mizanpajni kaydırgan ko'rinishda saqlashga harakat qiling va androidni olib tashlang: fitsSystemWindows = "rost" va faqat o'lchamlarni moslash
qo'shib qo'ydi muallif Varun Jain, manba
fitsSystemWindow oddiygina statusbarning orqasida fikringizni tortadi. mumkin bo'lgan takroriymi? stackoverflow.com/questions/37454733/… Misol tartibini joylashtirasizmi - bu muammoni keltirib chiqaradigan juda ko'p kombinatsiyalar mavjud.
qo'shib qo'ydi muallif ayvazj, manba
@VarunJain agar siz tezda sharhlaringizni va javoblaringizni ayta olsangiz, men sizga ne'matni beraman! (u bir soatdan oz vaqt ichida tugaydi)
qo'shib qo'ydi muallif Kaitlyn Hanrahan, manba
Muammoingizni to'g'ri tushunolmayapman. Joriy versiya aylantirilganda asboblar panelini yashirishni xohlaysizmi? Sizning "resume" tugmachasini ochish uchun, sizning "RealtiveLayout" ni NestedScrollView ichida joylashtirishga urindingizmi? Agar siz => Lollipop bo'lsangiz, sizning statusingizni ColorPrimaryDark-ni sizning mavzinizda belgilashingiz mumkin
qo'shib qo'ydi muallif Wiktor Wardzichowski, manba

7 javoblar

Operatsion tizim bilan yaxshi ishlaydigan ko'rinadigan bir yechim topdim. Birinchi navbatda fitSystemWindows = true oynasiga javob berishni xohlagan ko'rinishga qo'ying va keyin yuqoriga to'ldirishni e'tiborsiz qoldiring:

  ViewCompat.setOnApplyWindowInsetsListener(yourView, (view, insets) ->
      ViewCompat.onApplyWindowInsets(yourView,
          insets.replaceSystemWindowInsets(insets.getSystemWindowInsetLeft(), 0,
              insets.getSystemWindowInsetRight(), insets.getSystemWindowInsetBottom()))
  );

Read more here: https://medium.com/google-developers/why-would-i-want-to-fitssystemwindows-4e26d9ce1eec

1
qo'shib qo'ydi
Yaxshi javob.
qo'shib qo'ydi muallif Bolling, manba

Mizanpajni kaydırgan ko'rinishda saqlashga harakat qiling va androidni olib tashlang: fitsSystemWindows = "rost" va faqat o'lchamlarni moslash

1
qo'shib qo'ydi
Sizning javobingizni bir oz ko'proq ishlab chiqa olasizmi ... Agar "fitSystemWindows" dan foydalanmasangiz, correctResize men uchun hech narsa qilmaganday ko'rinadi. Rahmat :)
qo'shib qo'ydi muallif feresr, manba
Haha ... Ha, ne'mat uchun minnatdorman, men sizning muammolaringizni hal qiladigan tartibda ozgina o'zgartirish kiritib, javobni qo'shganman ... kelgusida qo'llab-quvvatlanadigan bo'lsangiz, darhol yordamimga whatsapp raqamimni yozib yuboring: - + 91- 8585949830
qo'shib qo'ydi muallif Varun Jain, manba
Yaxshiyamki, kimdir sovrinni olishga muvaffaq bo'ldi :) Men bardoshi tugamasdan oldin sizning yechimni to'liq sinab ko'rishga vaqtim yo'q edi. Sizning sodda yechimingiz StatusBarni xohlagan uslubimga aylantiradi va men sayr qila olaman ... lekin faqat ScrollView ichidagi UI qismlariga o'tishim mumkin. ScrollViewdan tashqarida bo'lgan "davom etish" tugmasi klaviaturani ko'rish mumkin emas. Savolga kod namunasi qo'shib qo'ydim - iltimos fikringizni berasizmi va menga biron bir fikringiz bormi? Rahmat!
qo'shib qo'ydi muallif Kaitlyn Hanrahan, manba
Tashqi RelativeLayout ilovasini boshqa ScrollView-ga joylashtirishga urindim, ammo keyin Continue Button ekranning past qismida edi, u tarkibning past qismida edi.
qo'shib qo'ydi muallif Kaitlyn Hanrahan, manba

Men sizning savolingizga to'g'ri javob bermadingiz, ammo men bu masalani hal qilish uchun tushunsam,

To'ldirish muammosini qo'shishga harakat qiling

android:fitsSystemWindows="true"
android:clipToPadding=”false”

Va shaffof holat paneli uchun qo'shing

@android:color/transparent

Sizning AppTeksiyangizga. Umid qilamanki, dam olishni iloji boricha muammoni hal qilish uchun muammoingizni hal qilishingiz mumkin.

1
qo'shib qo'ydi
clipToPadding mening muammomni hal qildi, bu erda fitsSystemWindows = "false" va fitsSystemWindows = "rost" ... yordamida bir qism ishlatiladi ... windowSoftInputMode = "adjustResize" faoliyati bilan birga. ClipTopPadding = "FALSE" ni belgilashdan oldin, asboblar paneli ostida keraksiz plomba ko'rdim.
qo'shib qo'ydi muallif Codeversed, manba

Agar siz hali ham biror qarorga muhtoj bo'lsangiz - men uchun ishlaydigan narsani topdim.

XML-ga qarang, men quyidagi narsalarni tushuntiraman:



                //NO FITSYSTEMWINDOWS=TRUE

                    //NO FITSYSTEMWINDOWS=TRUE

                                 //IMPORTANT

                

                                         //IMPORTANT

                        

                        
                    

                    

                        

                    
                
            

            

                
            
        
    

CollapsingToolbarLayout bilan CL dan foydalanmoqchiman, lekin bu muhim emas. Agar siz buni amalga oshirishni xohlasangiz, eng yaxshi usullarni qo'llang:

  1. Put CoordinatorLayout as a ROOT PARENT in your xml and set fitsSystemWindows="true" to it;

  2. Put RelativeLayout (or whatever you want) into your parent CoordinatorLayout, but DONT SET fitsSystemWindows="true";

  3. Set NEGATIVE top margin to you RelativeLayout by getting your statusbar height programmatically and set statusbar color as Color.TRANSPARENT, here's my code:

    public void adjustActivityForTransparentStatusBar(boolean adjust) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { if (adjust) { if (findViewById(R.id.rl_root) != null) { CoordinatorLayout.LayoutParams params = new CoordinatorLayout.LayoutParams(CoordinatorLayout.LayoutParams.MATCH_PARENT, CoordinatorLayout.LayoutParams.MATCH_PARENT); params.setMargins(0, -Utils.getStatusBarHeight(), 0, 0); findViewById(R.id.rl_root).setLayoutParams(params); } getWindow().setStatusBarColor(Color.TRANSPARENT); } else { if (findViewById(R.id.rl_root) != null) { CoordinatorLayout.LayoutParams params = new CoordinatorLayout.LayoutParams(CoordinatorLayout.LayoutParams.MATCH_PARENT, CoordinatorLayout.LayoutParams.MATCH_PARENT); params.setMargins(0, 0, 0, 0); findViewById(R.id.rl_root).setLayoutParams(params); } } } }

  4. Set fitsSystemWindows="true" to some child views if they should be "beneath" your statusbar. And now it should be working.

PS: Java kodimni nima uchun kodga o'xshashligini bilmayman.

0
qo'shib qo'ydi

Muammoni hal qildim va oxirida sinov bo'ldi. Iltimos, mos keladigan tartibni framelayout-ga o'zgartiring:


    <!-- CoordinatorLayout because this view uses SnackBars -->

    <!-- Relative Layout to lock "continue" button bar to bottom -->
    

        <!-- Main content, that scrolls with or without keyboard -->
        <!-- Correctly sits behind transparent Status Bar -->
        
            
                <!-- ACTUAL VIEWS DELETED FOR BREVITY/CLARITY -->
            
        


        <!-- Bottom nav bar -->
        <!-- Correctly sits at bottom of UI when keyboard is not visible -->
        <!-- PROBLEM: Not accessible when soft keyboard is visible -->
        

            <button
                android:id="@+id/skip_button"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight=".5"
                style="?android:attr/buttonBarButtonStyle"/>

            <button
                android:id="@+id/button_progress"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight=".5"
                style="?android:attr/buttonBarButtonStyle"/>
        

    

0
qo'shib qo'ydi
Lekin men samsung chekkasida ssh.shundan yuqoriroq kodni ishlatib, marshmallowda testni boshladim va klaviatura bilan ochiladigan softkeyboard pastki tartibini ochish va klaviatura pastki tartibini yashirish uchun pastga tushadi ...
qo'shib qo'ydi muallif Varun Jain, manba
Bu hech qanday farq qilmaydi. Androidning qaysi versiyasi siz uchun ikkita (1) yumshoq klaviatura ustida ko'rinadigan pastki tugma paneli va (2) shaffof holat paneli?
qo'shib qo'ydi muallif Kaitlyn Hanrahan, manba

(o'z savolga javob berish)

This does seem to be a bug in android: https://code.google.com/p/android/issues/detail?id=63777

Yuqoridagi xatoliklar haqidagi xabarlar, maxsus Layout class yoki maxsus Soft Keyboard yaratish kabi bir necha tavsiya etilgan ish joylariga havola qiladi.

O'zim shunga o'xshash vaqtni behuda sarflaganim kabi his qilaman. Shunday qilib, mening qarorim faqatgina Status panelini qo'lda qo'llashdir.

Biznes:

  1. Set android:fitsSystemWindows="true" in either the Layout's root view or globally in style.xml. This (along with adjustResize in the manifest) makes the UI shrink above the Soft Keyboard so no UI is blocked -- the most important thing.

  2. Color the Status Bar. This is only possible in Lollypop and newer. Which is the same as the transparent StatusBar, anyway.

    private void updateStatusBarColor(){
       //Check Version
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
           //OPTIONAL: Calculate a darker version of the toolbar color
            int color = calculateDarkerColor(toolBarColor);
    
           //Get the statusBar
            Window window = getWindow();
           //You can't color a transparent statusbar
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
           //Set the color
            window.setStatusBarColor(color);
        }
    }
    
    // Calculate a darker version of a given color
    // Note I do this because the color always changes, if it's always the same I would save the darker version as a Resource in colors.xml
    private int calculateDarkerColor(int color){
        float[] hsv = new float[3];
        Color.colorToHSV(color, hsv);
        hsv[2] *= 0.8f;//smaller = darker
        return Color.HSVToColor(hsv);
    }
    
0
qo'shib qo'ydi
Holbuki, holat satrining aslida orqasida joylashgan kontentga ega bo'lishni istasangiz, bu holat faqatgina ishlaydi.
qo'shib qo'ydi muallif htafoya, manba

U men uchun ishlaydi.

In manifest.xml, put this in tag.

android:windowSoftInputMode="adjustResize"

Tartibingizning yuqori tagida, buni qo'ying.

android:fitsSystemWindows="true"
android:clipToPadding="false"

Styles.xml da, buni qo'ying.

false
true
true
true

Buni minSdkVersion 16 va targetSdkVersion 26 bilan qildim

0
qo'shib qo'ydi