Başlangıç ​​Etkinliğinde otomatik açılan klavye


98

Görece basit bir sorum var. İçinde birçok EditText bulunan bir etkinliğim var. Aktiviteyi açtığımda, otomatik olarak ilk EditText'e odaklanır ve sanal klavyeyi görüntüler.

Bunu nasıl önleyebilirim?


Bu soruya cevabımı kontrol edin stackoverflow.com/questions/39593324/…
Android Yardım

Uygulamam Başlatıldığında (açık) ve metin düzenleme görünümü Mevcutsa, klavye Otomatik (göster) etkindir. Bu problem nasıl çözülür burayı tıklayın easycomacademy.com/…
AhmadUllah Ahmad

Yanıtlar:


210

Bu öznitelikleri XML dosyasında düzen etiketinizde kullanın:

android:focusable="true"
android:focusableInTouchMode="true"

Diğer üyeler tarafından yorumlarda bildirildiği gibi üzerinde çalışmaz, ScrollViewbu nedenle bu özellikleri ana alt öğesine eklemeniz gerekir ScrollView.


3
Bu benim sorunumu da çözdü. Bunu etkinliğim için RelativeLayout etiketine ekledim. Teşekkür ederim!
Luke

21
Yeterince ilginç bir şekilde, yukarıdakileri bir ScrollView'a eklediğimde işe yaramadı, ancak bir LinearLayout için işe yaradı
Jerry Brady

1
Sanırım onu ​​en üst düzene koymanız gerekiyor
Utsav Gupta

Sanırım bu işe yarıyor çünkü düzenin kendisine odaklanabileceğini söylüyorsunuz? Aksi takdirde, form üzerindeki ilk kontrole odaklanması gerektiğini varsayar? İşin garibi, formumdaki tüm kontroller devre dışı bırakılmış olsa bile klavyeyi alıyordum. Şimdi düzeltildi. Teşekkür ederim!
crowmagnumb

1
Bu çözümün erişilebilirlik sorunları yarattığını (odaklanılmaması gereken, odaklanmış olarak işaretlenen bir görüş) ve istenmeyen sonuçlara yol açabileceğini unutmamak önemlidir.
Renato

97

Bunu Android Manifest etkinliğinize ekleyebilirsiniz:

android:windowSoftInputMode="stateHidden|adjustResize"

Bu çalışır, ancak bir görüntü arka planınız varsa ve yumuşak Klavyenizin bu tür görüntü arka planını küçültmesinden endişeleniyorsanız, kullanınandroid:windowSoftInputMode="stateHidden|adjustPan"
ArtiomLK

31

Birkaç uygulamaları Burada anlatılan, ama şimdi ben içine eklemiş AndroidManifest.xmlbenim için Activitymülk:

android:windowSoftInputMode="stateAlwaysHidden"

Kullanıyor olsanız bile bunun kolay yol olduğunu düşünüyorum fragments.

" stateAlwaysHidden " Etkinliğin ana penceresi giriş odağına sahip olduğunda yazılım klavyesi her zaman gizlidir.


bu benim için hem ScrollView hem de RelativeLayout ile çalıştı.
iversoncru

Parçalar için o kadar da iyi değil, çünkü "gizli durumu" tüm parçalarınızı içerecek etkinlikle ilişkilendiriyorsunuz, bu, etkinlikte görüntülemek istediğiniz herhangi bir parçanın özellikten etkileneceği anlamına gelir (parça başına değil "temel).
Pelpotronic

11

Aktiviteniz hakkında a gibi başka bir görünümünüz varsa ListView, şunları da yapabilirsiniz:

ListView.requestFocus(); 

onResume () 'de editText.

Bu sorunun yanıtlandığını biliyorum ama sadece benim için işe yarayan alternatif bir çözüm sağlıyorum :)


5

https://stackoverflow.com/a/11627976/5217837 Bu neredeyse doğru:

@Override
public void onCreate(Bundle savedInstanceState) {

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

}

Ancak SOFT_INPUT_STATE_ALWAYS_VISIBLE yerine SOFT_INPUT_STATE_HIDDEN olmalıdır


4

Bunu Faaliyet kodunuzda kullanın:

@Override
public void onCreate(Bundle savedInstanceState) {

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

}

Bu benim için işe yaramadı - etkinliğime başladığımda klavye hala açıldı.
David Doria

Bu bağlantıyı kontrol edebilirsiniz, işe yarayacak: stackoverflow.com/questions/18977187/…
Sujeet Kumar Gupta

3

Tablette Android 3.2.1 ile, sekmeler arasında geçiş yaparken bile klavye otomatik olarak açıldı ve açık kaldı. Aşağıdaki yöntemi kullanın:

public void setEditTextFocus(EditText searchEditText, boolean isFocused)
{
    searchEditText.setCursorVisible(isFocused);
    searchEditText.setFocusable(isFocused);
    searchEditText.setFocusableInTouchMode(isFocused);
    if (isFocused) {
        searchEditText.requestFocus();
    } else {
        InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
        inputManager.hideSoftInputFromWindow(searchEditText.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS );
    }
}   

Her EditText için etkinliğin onCreate () ve onPause () bölümünde:

setEditTextFocus (myEditText, false);

Her EditText için bir OnTouchListener:

    myEditText.setOnTouchListener(new EditText.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            setEditTextFocus(myEditText, true); 
            return false;
        }
    });

Her EditTextbiri için OnEditorActionListener:

    myEditText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) {
                            .......
            setEditTextFocus(myEditText, false); 
            return false;
        }
    });

Ve her EditTextbiri için layout xml:

            android:imeOptions="actionDone"
            android:inputType="numberDecimal|numberSigned" // Or something else

Muhtemelen daha fazla kod optimizasyonu mümkündür.


3
((InputMethodManager)getActivity().getSystemService("input_method")).hideSoftInputFromWindow(this.edittxt.getWindowToken(), 0);

fragment kullanılıyor .. bu kod klavyeyi gizlemek için çalışıyor ... bir fragman açıldığında edittext alan klavyesine odaklanmaktan kaçının ...
Sreelal S

2

Benim için işe yarayan bu basit çözümü buldum. Ana mizanpajınızda şu özellikleri ayarlayın:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mainLayout"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true" >

Ve şimdi, etkinlik başladığında bu ana düzen varsayılan olarak odaklanacaktır.

Ayrıca, odağı çalışma zamanında ana düzene tekrar vererek odağı alt görünümlerden kaldırabiliriz, örneğin:

findViewById(R.id.mainLayout).requestFocus();

Umarım sizin için çalışacaktır.


1

bu benim kullandığım çözüm, en iyi çözüm değil ama benim için iyi çalışıyor

 editComment.setFocusableInTouchMode(false);
 editComment.setOnTouchListener(new OnTouchListener(){

                @Override
                public boolean onTouch(View v, MotionEvent event)
                {
                    // TODO Auto-generated method stub
                    editComment.setFocusableInTouchMode(true);
                     editComment.requestFocus() ;
                    return false;
                }});

1

İlginç bir şekilde, bu belge https://developer.android.com/training/keyboard-input/visibility.html , bir etkinlik başladığında ve bir metin alanına odaklandığında, sanal klavyenin gösterilmediğini (ve ardından bazı kodlarla isterseniz klavyenin nasıl gösterileceğini gösterir).

Samsung Galaxy S5'imde, uygulamam (herhangi bir bildirim girişi veya belirli bir kod olmadan) bu şekilde çalışıyor - yazılım klavyesi yok. Bununla birlikte, bir Lollipop AVD'de, yukarıda verilen belgeye aykırı bir yumuşak klavye gösterilir.

Bir AVD'de test ederken bu davranışı alırsanız, ne olduğunu görmek için gerçek bir cihazda test etmek isteyebilirsiniz.


1

Bunun aşağıdaki gönderide bazı iyi cevapları var: EditText'in Etkinlik başlangıcında odak kazanmasını durdurun . Düzenli olarak kullandığım, Morgan'ın aşağıdaki kodu :

<!-- Dummy item to prevent AutoCompleteTextView from receiving focus -->
<LinearLayout
    android:focusable="true" 
    android:focusableInTouchMode="true"
    android:layout_width="0px" 
    android:layout_height="0px"/>

<!-- :nextFocusUp and :nextFocusLeft have been set to the id of this component
to prevent the dummy from receiving focus again -->
<AutoCompleteTextView android:id="@+id/autotext"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:nextFocusUp="@id/autotext"     
    android:nextFocusLeft="@id/autotext"/>

NOT: Sahte öğe, odaklanabilir öğeden ÖNCE SAĞA YERLEŞTİRİLMELİDİR.

Ve ScrollView ile bile mükemmel çalışması gerektiğini düşünüyorum ve bunun için de erişilebilirlikle ilgili herhangi bir sorun yaşamadım.


0

Bu, düzenleme başlığınız gibi otomatik olarak Odak aldığınızda gerçekleşir. Dolayısıyla, bunu düzeltmenin kolay ve kararlı bir yolu, ilk odağı Düğme vb. Gibi başka bir görünüme ayarlamaktır.

Bunu mizanpaj XML'inizde yapabilirsiniz, kod gerekmez ..


0

Kabul edilen cevap benim için çalışmıyor, bu yüzden cevap çalışma çözümü verin, faydalı olabilir!

EditText edt = (EditText) findViewById(R.id.edt);
edt.requestFocus();    
edt.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
edt.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));

Şimdi klavye açık, keyfini çıkarın :)


Soru, klavyenin açılmasını nasıl engelleyeceğiydi .
jk7

0

android: windowSoftInputMode = "stateHidden | AdjustResize"

İyi çalışıyor


0

Aşağıdaki kodu etkinlik XML'inize ekleyin ve Görünüm'ün EditText'in üstünde olduğundan emin olun

<View 
android:layout_width="0dp"
android:layout_height="0dp"
android:focusableInTouchMode="true"/>

0

android:focusableInTouchMode="true"

Yukarıdaki satırı xml'ye EditTextveya TextInputLayoutodağı olan ve satırının softInputKeyboardaçılmasına neden olana ekleyin .

Bu bizim için sorunu çözdü ve şimdi klavye açılmıyor


0

search_edit_text = (Metni Düzenle) findViewById (R.id.search_edit_text);

    search_edit_text.requestFocus();
    search_edit_text.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
    search_edit_text.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));

Bu benim için çalışıyor çocuklar fragmanın bazı farklı sözdizimi olabilir. BU AKTİVİTE İÇİN ÇALIŞIYOR


Cevabınızda herhangi bir sınırlama, varsayım veya basitleştirme sağlamanız gerekir. Bu bağlantıda nasıl yanıt vereceğinizle ilgili daha fazla ayrıntı görün: stackoverflow.com/help/how-to-answer
Usama Abdulrehman

-1

Görünümünüzde EditText ve Listview varsa, Klavye varsayılan olarak açılacaktır. Klavyenin varsayılan olarak açılmasını gizlemek için aşağıdakileri yapın

this.listView.requestFocus();

EditText için görünümü aldıktan sonra liste görünümüne odaklanmak istediğinizden emin olun.

Örneğin

this.listView = (ListView) this.findViewById(R.id.list);
this.editTextSearch = (EditText) this.findViewById(R.id.editTextSearch);
this.listView.requestFocus();

Bunu yaparsanız, editText odaklanır ve klavye açılır.


Bunu yaptım ama klavye hala açılıyor ve odak editText'te.
David Doria
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.