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?
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?
Yanıtlar:
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, ScrollView
bu nedenle bu özellikleri ana alt öğesine eklemeniz gerekir ScrollView
.
Bunu Android Manifest etkinliğinize ekleyebilirsiniz:
android:windowSoftInputMode="stateHidden|adjustResize"
android:windowSoftInputMode="stateHidden|adjustPan"
Birkaç uygulamaları Burada anlatılan, ama şimdi ben içine eklemiş AndroidManifest.xml
benim için Activity
mülk:
android:windowSoftInputMode="stateAlwaysHidden"
fragments
." stateAlwaysHidden " Etkinliğin ana penceresi giriş odağına sahip olduğunda yazılım klavyesi her zaman gizlidir.
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
Bunu Faaliyet kodunuzda kullanın:
@Override
public void onCreate(Bundle savedInstanceState) {
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
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 EditText
biri 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 EditText
biri için layout xml
:
android:imeOptions="actionDone"
android:inputType="numberDecimal|numberSigned" // Or something else
Muhtemelen daha fazla kod optimizasyonu mümkündür.
((InputMethodManager)getActivity().getSystemService("input_method")).hideSoftInputFromWindow(this.edittxt.getWindowToken(), 0);
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.
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;
}});
İ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.
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.
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 :)
android: windowSoftInputMode = "stateHidden | AdjustResize"
İyi çalışıyor
android:focusableInTouchMode="true"
Yukarıdaki satırı xml'ye EditText
veya TextInputLayout
odağı olan ve satırının softInputKeyboard
açılmasına neden olana ekleyin .
Bu bizim için sorunu çözdü ve şimdi klavye açılmıyor
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
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.