ฉันมีคำถามง่ายๆเกี่ยวกับญาติ ฉันมีกิจกรรมที่มี EditText มากมายอยู่ในนั้น เมื่อฉันเปิดกิจกรรมจะเน้นไปที่ EditText แรกโดยอัตโนมัติและแสดงแป้นพิมพ์เสมือน
ฉันจะป้องกันสิ่งนี้ได้อย่างไร?
ฉันมีคำถามง่ายๆเกี่ยวกับญาติ ฉันมีกิจกรรมที่มี EditText มากมายอยู่ในนั้น เมื่อฉันเปิดกิจกรรมจะเน้นไปที่ EditText แรกโดยอัตโนมัติและแสดงแป้นพิมพ์เสมือน
ฉันจะป้องกันสิ่งนี้ได้อย่างไร?
คำตอบ:
ใช้แอตทริบิวต์นี้ในแท็กโครงร่างของคุณในไฟล์ XML:
android:focusable="true"
android:focusableInTouchMode="true"
ตามการรายงานของสมาชิกคนอื่น ๆ ในความคิดเห็นก็ไม่ได้ทำงานบนดังนั้นคุณจำเป็นต้องเพิ่มแอตทริบิวต์เหล่านี้กับเด็กในหลักของScrollView
ScrollView
คุณสามารถเพิ่มสิ่งนี้ในกิจกรรม Android Manifest ของคุณ:
android:windowSoftInputMode="stateHidden|adjustResize"
android:windowSoftInputMode="stateHidden|adjustPan"
ฉันมีการใช้งานหลายอย่างที่อธิบายไว้ที่นี่ แต่ตอนนี้ฉันได้เพิ่มเข้าไปในAndroidManifest.xml
คุณสมบัติของฉันActivity
:
android:windowSoftInputMode="stateAlwaysHidden"
fragments
ผมคิดว่านี่เป็นวิธีที่ง่ายแม้ว่าคุณจะใช้" stateAlwaysHidden " แป้นพิมพ์แบบนิ่มจะซ่อนอยู่เสมอเมื่อหน้าต่างหลักของกิจกรรมมีโฟกัสเข้า
หากคุณมีมุมมองอื่นเกี่ยวกับกิจกรรมของคุณเช่น a ListView
คุณสามารถทำได้:
ListView.requestFocus();
ใน onResume () ของคุณเพื่อจับโฟกัสจากไฟล์editText
.
ฉันรู้ว่าคำถามนี้ได้รับคำตอบแล้ว แต่แค่ให้ทางเลือกอื่นที่เหมาะกับฉัน :)
https://stackoverflow.com/a/11627976/5217837ถูกต้องเกือบ:
@Override
public void onCreate(Bundle savedInstanceState) {
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
แต่ควรเป็น SOFT_INPUT_STATE_HIDDEN มากกว่า SOFT_INPUT_STATE_ALWAYS_VISIBLE
ใช้สิ่งนี้ในรหัสกิจกรรมของคุณ:
@Override
public void onCreate(Bundle savedInstanceState) {
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
ฉันมีปัญหาแบบจำลองแม้ว่าจะเปลี่ยนแท็บแป้นพิมพ์ก็โผล่ขึ้นมาโดยอัตโนมัติและยังคงใช้งาน Android 3.2.1 บนแท็บเล็ตได้ ใช้วิธีการดังต่อไปนี้:
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 );
}
}
ใน onCreate () และใน onPause () ของกิจกรรมสำหรับแต่ละ EditText:
setEditTextFocus (myEditText เท็จ);
สำหรับแต่ละ EditText OnTouchListener:
myEditText.setOnTouchListener(new EditText.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
setEditTextFocus(myEditText, true);
return false;
}
});
สำหรับแต่ละรายการEditText
ในOnEditorActionListener
:
myEditText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) {
.......
setEditTextFocus(myEditText, false);
return false;
}
});
และสำหรับแต่ละคน EditText
ในlayout xml
:
android:imeOptions="actionDone"
android:inputType="numberDecimal|numberSigned" // Or something else
อาจมีการเพิ่มประสิทธิภาพโค้ดได้มากขึ้น
((InputMethodManager)getActivity().getSystemService("input_method")).hideSoftInputFromWindow(this.edittxt.getWindowToken(), 0);
ฉันพบวิธีง่ายๆนี้ที่ใช้ได้ผลสำหรับฉันตั้งค่าคุณสมบัติเหล่านี้ในเค้าโครงหลักของคุณ:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mainLayout"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true" >
และตอนนี้เมื่อกิจกรรมเริ่มเค้าโครงหลักนี้จะได้รับโฟกัสตามค่าเริ่มต้น
นอกจากนี้เรายังสามารถลบโฟกัสออกจากมุมมองลูกในรันไทม์ได้โดยให้โฟกัสไปที่เค้าโครงหลักอีกครั้งเช่น
findViewById(R.id.mainLayout).requestFocus();
หวังว่าจะได้ผลสำหรับคุณ
นี่เป็นวิธีแก้ปัญหาที่ฉันใช้ไม่ใช่วิธีแก้ปัญหาที่ดีที่สุด แต่ใช้ได้ดีสำหรับฉัน
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;
}});
น่าสนใจเอกสารนี้https://developer.android.com/training/keyboard-input/visibility.htmlระบุว่าเมื่อกิจกรรมเริ่มต้นและให้โฟกัสไปที่ช่องข้อความแป้นพิมพ์อ่อนจะไม่แสดง (จากนั้นไปที่ แสดงวิธีการแสดงแป้นพิมพ์หากคุณต้องการด้วยรหัสบางอย่าง)
ใน Samsung Galaxy S5 ของฉันนี่คือวิธีการทำงานของแอพของฉัน (ที่ไม่มีรายการรายการหรือรหัสเฉพาะ) - ไม่มีแป้นพิมพ์ที่นุ่มนวล อย่างไรก็ตามใน Lollipop AVD จะมีการแสดงแป้นพิมพ์อ่อนซึ่งขัดกับเอกสารที่ระบุไว้ข้างต้น
หากคุณได้รับพฤติกรรมนี้เมื่อทำการทดสอบใน AVD คุณอาจต้องการทดสอบบนอุปกรณ์จริงเพื่อดูว่าเกิดอะไรขึ้น
นี้มีคำตอบที่ดีบางอย่างที่โพสต์ต่อไปนี้: หยุด EditText จากการมุ่งเน้นที่การเริ่มต้นกิจกรรม รหัสที่ฉันใช้เป็นประจำคือรหัสต่อไปนี้โดยMorgan :
<!-- 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"/>
บันทึก :รายการจำลองจะต้องถูกวางไว้ก่อนองค์ประกอบที่โฟกัสได้
และฉันคิดว่ามันควรจะทำงานได้อย่างสมบูรณ์แบบแม้กับ ScrollView และไม่มีปัญหาใด ๆ กับการช่วยสำหรับการเข้าถึงสำหรับสิ่งนี้
สิ่งนี้เกิดขึ้นเมื่อ EditText ของคุณได้รับ Focus โดยอัตโนมัติเมื่อคุณเริ่มกิจกรรม วิธีหนึ่งที่ง่ายและมั่นคงในการแก้ไขปัญหานี้คือการตั้งค่าโฟกัสเริ่มต้นไปที่มุมมองอื่น ๆ เช่นปุ่มเป็นต้น
คุณสามารถทำได้ใน XML เค้าโครงของคุณโดยไม่ต้องใช้รหัส ..
คำตอบที่ได้รับการยอมรับไม่ได้ผลสำหรับฉันนั่นคือเหตุผลที่ให้คำตอบวิธีแก้ปัญหาอาจเป็นประโยชน์!
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));
ตอนนี้คีย์บอร์ดเปิดแล้วสนุก :)
android: windowSoftInputMode = "stateHidden | adjustmentResize"
ทำงานได้ดี
เพิ่มโค้ดด้านล่างที่ด้านบนของ XML กิจกรรมและตรวจสอบให้แน่ใจว่า View อยู่เหนือ EditText
<View
android:layout_width="0dp"
android:layout_height="0dp"
android:focusableInTouchMode="true"/>
android:focusableInTouchMode="true"
เพิ่มบรรทัดด้านบนเป็น xml EditText
หรือTextInputLayout
ที่มีโฟกัสและทำให้เกิดไฟล์softInputKeyboard
ป๊อปอัป
สิ่งนี้ช่วยแก้ปัญหาให้เราได้และตอนนี้แป้นพิมพ์ไม่ป๊อปอัป
search_edit_text = (EditText) 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));
สิ่งนี้ใช้ได้ผลสำหรับฉันคนส่วนอาจมีไวยากรณ์ที่แตกต่างกัน สิ่งนี้ใช้ได้กับกิจกรรม
หากมุมมองของคุณมี EditText และ Listview Keyboard จะเปิดขึ้นตามค่าเริ่มต้น หากต้องการซ่อนแป้นพิมพ์ไม่ให้โผล่ขึ้นมาตามค่าเริ่มต้นให้ทำดังต่อไปนี้
this.listView.requestFocus();
ตรวจสอบให้แน่ใจว่าคุณกำลังขอโฟกัสที่ listview หลังจากได้รับมุมมองสำหรับ editText
สำหรับเช่น
this.listView = (ListView) this.findViewById(R.id.list);
this.editTextSearch = (EditText) this.findViewById(R.id.editTextSearch);
this.listView.requestFocus();
หากคุณทำเช่นนั้นแก้ไขข้อความจะได้รับโฟกัสและแป้นพิมพ์จะปรากฏขึ้น