Android: Yazılım klavyesinin görünümümü yukarı itmesini nasıl önleyebilirim?


386

Uygulamamın altında dikey bir kayar çekmecem var. Yazılım klavyesi açıldığında, çekmecenin tırnağını yukarı doğru iter, böylece klavyenin üstüne oturur. Aslında ekranın altında kalmasını ve klavye gösterildiğinde gizlenmesini istiyorum.

Bu sorunla karşılaşan başka kimse var mı? Nasıl düzelteceğinizi biliyor musunuz?


1
merhaba, manifest dosyasında kullandığınız bayrağı da aynı sorun yaşıyorum, bu konuda bana yardımcı olabilir misiniz
Nixit Patel

1
Bu soru burada çoğaltılmıştır: stackoverflow.com/questions/5516216/…
WonderWorker

Yanıtlar:


656

Siz sadece etkinlik'ın geçiş yapabilirsiniz windowSoftInputModebayrağı adjustPansizin de AndroidMainfest.xmletkinlik etiketinin içine dosyası.

Kontrol resmi belgelere daha fazla bilgi için.

<activity
   ...
   android:windowSoftInputMode="adjustPan"> 
</activity>

43
Görünümün kaydırılmasını istemiyorum, olduğu yerde statik kalmasını istiyorum ve klavyenin kaplayacağı her şeyi örtmesini istiyorum.
Christopher Perry

5
Kaydırma yaparak, yazdığınız görünümü görebilmek için görünümün kaydırılacağı anlamına gelir. Diğer bir deyişle, eğer sadece klavye odaklanmış görüntüyü örtmediyse, durağan kalacaktır.
Alexander Oleynikov

18
Ben de aynı problemle karşı karşıyayım. windowSoftInputMode bayrağını manifeast dosyasında "adjustPan" olarak ayarladı. ancak çalışmıyor. nasıl çözülür
Subrat

20
Ekranın altında bir sıra düğme ve üstlerinde bir ScrollView olması durumunda yardımcı olmaz. WindowSoftInputMode öğesinde hangi değer olursa olsun düğmeler yukarı itilir.
Artem Russakovskii

3
bir parçada çalışmıyor. Parça halinde nasıl yapılır?
Prashanth Debbadwar

175

Cevapların hiçbiri benim için işe yaramadı, ancak bu hile yaptı:

android:windowSoftInputMode="adjustNothing"

6
Bu, klavyenin yüksekliğini yeniden hesaplamak için düzen yapmadan içeriği üst üste bindirmesini sağlar.
Reinherd

13
Bu, klavyenin içeriği yukarı ittirme sorununu çözer, bu da ben ve OP'nin elde etmek istediği şeydir.
Daniel Douglas

8
@Dom'dan ödünç alarak getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);bu değeri programlı olarak ayarlayabilirsiniz
Bron Davies

1
Bu benim için çalışıyor, diğer cevapların aksine (jelly bean 4.1)
Virus721

Mükemmel! Benim durumumda da çalışıyor. İçinde düzenleme metni olan bir iletişim kutusu gösteriyorum. İletişim kutusu açılır açılmaz klavye de görünüyordu. "AdjustPan" denedim, ama klavye görünme özelliği engelledi. Yani, "adjustNothing" benim durumumda daha iyi çalıştı.
sembozdemir

85

Benim durumumda, düğmelerin yukarı itilmesinin nedeni, üstlerindeki görünümün bir olması ScrollViewve hangi değeri android:windowSoftInputModeayarladığım önemli değil, klavyenin üzerine itilen düğmelerle daraltılmış olmasıydı.

Ben ayarlayarak yumuşak klavye tarafından yukarı itilir alma düğmelerin benim alt satır önlemek başardı android:isScrollContainer="false"üzerinde ScrollViewdüğmelerin üzerinde oturur söyledi.


2
Ancak bu durumda yumuşak klavye ekranın bir bölümünü kaplar ve aşağı kaydırmanın bir yolu yoktur. Alt panelin klavyenin üstünde görünmesini önlemenin tek bir yolu var gibi görünüyor - klavye açıkken gizleniyor ...
Dmitry

1
budur! Bence "adjustNothing" eksik özelliğinin etkilerini elde etmek için bulduğum tek yol gibi, bu ayar benim görüşüme göre çok ilginç!
13'te

Textview Working great tnx
Sunil Chaudhary

2
@Artem Russakovskii Kim olduğunu bilmiyorum, ama bu çözüm için seni seviyorum. Çok teşekkürler.
Lev

1
@Artem Russakovskii bu mükemmel çalışıyor. Çok teşekkürler.
SkypeDogg

72

Aşağıdaki özelliği onCreateetkinliğinizin yöntemine ekleyerek bu özelliği dinamik olarak eklemeyi deneyebilirsiniz :

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

Bu benim için çalıştı, ama şu:

android:windowSoftInputMode="adjustPan"

daha hiç.


android:windowSoftInputMode="adjustPan"AndroidManifest.xml dosyasına eklediniz mi?
Habeeb Perwad

Hayır, benim için gerçekten bir fark yaratmadı. İlk kod satırı işi yaptı. :) @HabeebPerwad
Dom

Saniye satırını AndoidManifest.xml dosyasına ekledim. Bundan sonra sadece işe yaradığını düşünüyorum. diye sordum.
Habeeb Perwad

1
@Dom, getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);bir parçada " " nasıl kullanılır ?
Tushar Gogna

1
En sonunda! Bu çalışıyor! Bir denetleyici vardı (uzanır FragmentActivity) ve bazı görünümler ona bağlı (görünümler uzanır RelativeLayout). Yani zahmetli görüşte controller.getWindow()...söylediğin gibi yaptım . Works
Alaa

39

Buradaki cevaplar bana yardımcı olmadı. Bu yüzden denedim:

android:windowSoftInputMode="adjustResize"

Bu bir cazibe gibi çalıştı, Şimdi benim app başlığı kaybolmuyor. Daha pürüzsüz.


Bu neredeyse benim için mükemmel çalışıyor. Tek sorun, klavyenin öneri çubuğunun / satırının düzenimi hala gizlemesidir. Böyle bir sorunla mı karşılaştınız?
Sufian

Bu sorunla karşılaşmadım. @Sufian
amalBit

O zamanlar hiçbir sorunla karşılaşmamıştım. Şimdi emin değilim. @Sufian
amalBit

Benzer bir sorunla karşı karşıya kalabilecekler için, muhtemelen nedeniyledir TabLayout. Görünürlüğünü ayarladığımda sorun ortadan kalktı View.GONE. Düzenimi yeniden tasarlamanın zamanı gelmiş olabilir.
Sufian

13

Bunu bir parça içinde programlı olarak yapmak için aşağıdaki kodu kullanabilirsiniz

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

Bunu onResume () içine yerleştirin


11

Gelecekteki okuyucular için.

Bu sorun üzerinde özel kontrol istedim, bu yüzden yaptım:

Bir parça veya etkinlikten, diğer görünümlerinizi (klavye açıkken gerekli değildir) gizleyin , ardından bu sorunu çözmek için geri yükleyin :

            rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    Rect r = new Rect();
                    rootView.getWindowVisibleDisplayFrame(r);
                    int heightDiff = rootView.getRootView().getHeight() - (r.bottom - r.top);

                    if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...
                    //ok now we know the keyboard is up...
                        view_one.setVisibility(View.GONE);
                        view_two.setVisibility(View.GONE);

                    }else{
                    //ok now we know the keyboard is down...
                        view_one.setVisibility(View.VISIBLE);
                        view_two.setVisibility(View.VISIBLE);

                    }
                }
            });

1
@Skynet Kesinlikle haklısın! Bu, kendi sorunum için kullandığım özel bir çözümdü.
Petro

7
Hey, bu harikaydı. Ancak, klavyenin kapalı olduğu durumda, görünümün görünür hale getirildiği kısa bir süre (milisaniye) vardır. Görünürlüğü doğrudan ayarlamak yerine view.post(Runnable runnable), görünürlüğü oradan kullandım ve ayarladım. Benim için harika çıktı
daisura99

9

Eklenecek tek bir satır ...

İçin android:windowSoftInputMode="stateHidden|adjustPan"gerekli aktiviteyi ekleyin manifest file.

Az önce çözüldüm :) :)


8

Xamarin kullanıcıları için bu kodu MainActivity sınıfının Activity özniteliğine ekler,

WindowSoftInputMode =Android.Views.SoftInput.AdjustNothing

veya bu kodu Window.SetSoftInputMode(Android.Views.SoftInput.AdjustNothing)MainActivity sınıfının OnCreate yöntemine ekleyebilirsiniz .


8

Bu benim için çalıştı

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

7

Şimdiye kadar, klavye tarafından gizlenmeye devam eden textView altında bir düğme ve bir textInput alanı (yan yana) olduğu için cevaplar bana yardımcı olmadı, ancak bu sorunumu çözdü:

android:windowSoftInputMode="adjustResize"

7

Manifest dosyasının 'etkinliğine' aşağıdaki kodu ekleyin.

android:windowSoftInputMode="adjustResize"

Bu iyi çalışıyor. Ancak, sadece tavsiye için, yüzde kullandığınızda iyi çalışmaz. Çünkü bazı unsurları yeniden ayarlar. Yani, yüzde ile Kısıtlama öğeleri varsa, sorun olacaktır. Bunun yerine wrap_content kullanın ve çok iyi çalışır.
Thiago Silva



4

Peki bu cevapları izledim ama benim durumumda aynı konuya düştüm ve xml dosyanızda bulunan Scrollview etiketinize çok küçük masum bir özellik koymayı içeren çok kullanışlı ve en kolay bir çözümle sığındım. Yani

android:isScrollContainer="false"

İyi şanslar!


4
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

Bu benim için çalışıyor.


2

Kaydırma Görünümü için:

android:windowSoftInputMode="stateHidden|adjustPan"Android Manifestinize ekledikten sonra ve hala çalışmıyorsa.

Etkilenebilir, çünkü klavye göründüğünde, kaydırma görünümüne girer ve düğmeniz / herhangi bir nesne kaydırma görünümünüzde değilse, nesneler klavyeyi izler ve konumunu taşır.

Düğmenize nerede xml göz atın ve dışarı kaydırma değil kaydırma kaydırma parantez altında olduğundan emin olun.

Umarım bu yardımcı olur. : D


2

Benim durumumda klavyenin gizli kalması gerekiyordu ve düğmenin tıklanmasından hemen sonra düzenimin ayarlanması gerekiyor, bu yüzden manifest'e bu komutu ekledim ve süper doğru oldu.

android:windowSoftInputMode="stateHidden|adjustResize"

2

Klavyeyi açtığınızda görünümü gizlemek istediğinizde.

Bunu bildirim dosyasında Etkinliğinize ekleyin

android:windowSoftInputMode="stateHidden|adjustPan"

2

Hiçbiri benim için çalışmadı, bunu dene

 private void scrollingWhileKeyboard() {
    drawerlayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {

            Rect r = new Rect();
            try {
                drawerlayout.getWindowVisibleDisplayFrame(r);
                int screenHeight = drawerlayout.getRootView().getHeight();
                int keypadHeight = screenHeight - r.bottom;
                if (keypadHeight > screenHeight * 0.15) {
                    tabLayout.setVisibility(View.GONE);
                } else {
                    tabLayout.setVisibility(View.VISIBLE);
                }
            } catch (NullPointerException e) {

            }
        }
    });

}

1

Etkinliğin ana penceresi, yazılım klavyesine yer açmak için yeniden boyutlandırılmaz. Bunun yerine, pencerenin içeriği otomatik olarak kaydırılır, böylece mevcut odak klavye tarafından asla gizlenmez ve kullanıcılar ne yazdıklarını her zaman görebilirler.

android:windowSoftInputMode="adjustPan"

Bu, istediğiniz şey için daha iyi bir çözüm olabilir.


1

Bunu kullanmaya çalışın:

android:windowSoftInputMode="stateHidden|adjustPan"

1

Bu kod size yardımcı olabilir. oncreateYönteminizde kullanın .

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

Bunu denedim ama görünümün alt kısmından biraz keser ve yukarıdaki zamana bindirmek için görünümü iter sorunları yaşıyorum? Hangi yerleşim düzeninin değiştiğine veya neye ihtiyaç duyulduğuna dair bir fikriniz var mı? stackoverflow.com/questions/39909897/…
Lion789

1

Manifest dosyanıza görüntülemek istediğiniz etkinlik altına dahil edin.Ama Tam Ekran Etkinliği kullanmadığınızdan emin olun

android:windowSoftInputMode="adjustPan"

1

Faaliyetinizde @manifest:

android:windowSoftInputMode="stateAlwaysHidden|adjustPan"

1

Sorunumu ekleyerek çözdüm

 android:windowSoftInputMode="adjustNothing" 

Manifest dosyasında ekleyin.

ve Recyclerviews kısıtlamasını isScrollContainer olarak false olarak ayarlamak.

android:isScrollContainer="false"
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.