แป้นพิมพ์ป๊อปอัพอัตโนมัติเมื่อเริ่มกิจกรรม


99

ฉันมีคำถามง่ายๆเกี่ยวกับญาติ ฉันมีกิจกรรมที่มี EditText มากมายอยู่ในนั้น เมื่อฉันเปิดกิจกรรมจะเน้นไปที่ EditText แรกโดยอัตโนมัติและแสดงแป้นพิมพ์เสมือน

ฉันจะป้องกันสิ่งนี้ได้อย่างไร?


ตรวจสอบคำตอบของฉันสำหรับคำถามนี้stackoverflow.com/questions/39593324/…
Android Help

เมื่อแอปของฉันเปิดใช้งาน (เปิด) และหากมุมมองแก้ไขข้อความพร้อมใช้งานแป้นพิมพ์จะเปิดใช้งานอัตโนมัติ (แสดง) วิธีแก้ปัญหานี้คลิกที่นี่easycomacademy.com/…
AhmadUllah Ahmad

คำตอบ:


210

ใช้แอตทริบิวต์นี้ในแท็กโครงร่างของคุณในไฟล์ XML:

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

ตามการรายงานของสมาชิกคนอื่น ๆ ในความคิดเห็นก็ไม่ได้ทำงานบนดังนั้นคุณจำเป็นต้องเพิ่มแอตทริบิวต์เหล่านี้กับเด็กในหลักของScrollViewScrollView


3
สิ่งนี้ช่วยแก้ปัญหาของฉันได้เช่นกัน ฉันเพิ่มสิ่งนี้ลงในแท็ก RelativeLayout สำหรับกิจกรรมของฉัน ขอบคุณ!
Luke

21
ที่น่าสนใจก็คือมันใช้งานไม่ได้เมื่อฉันเพิ่มด้านบนลงใน ScrollView แต่มันใช้งานได้กับ LinearLayout
Jerry Brady

1
ฉันคิดว่าคุณต้องวางไว้บนสุด
Utsav Gupta

ฉันเดาว่ามันได้ผลเพราะคุณกำลังบอกเลย์เอาต์เองว่ามันสามารถโฟกัสได้? มิฉะนั้นจะถือว่าจำเป็นต้องให้ความสำคัญกับการควบคุมแรกในแบบฟอร์ม? ผิดปกติพอฉันได้รับแป้นพิมพ์แม้ว่าการควบคุมทั้งหมดในแบบฟอร์มของฉันจะถูกปิดใช้งาน แก้ไขแล้ว ขอบคุณ!
crowmagnumb

1
โปรดทราบว่าโซลูชันนี้สร้างปัญหาการเข้าถึง (มุมมองที่ไม่ควรโฟกัสได้ถูกทำเครื่องหมายว่ามีโฟกัส) และอาจส่งผลที่ไม่คาดคิดได้
Renato

97

คุณสามารถเพิ่มสิ่งนี้ในกิจกรรม Android Manifest ของคุณ:

android:windowSoftInputMode="stateHidden|adjustResize"

อย่างไรก็ตามวิธีนี้ใช้งานได้หากคุณมีพื้นหลังภาพและกังวลว่าแป้นพิมพ์แบบนิ่มของคุณจะหดพื้นหลังของภาพให้ใช้android:windowSoftInputMode="stateHidden|adjustPan"
ArtiomLK

31

ฉันมีการใช้งานหลายอย่างที่อธิบายไว้ที่นี่ แต่ตอนนี้ฉันได้เพิ่มเข้าไปในAndroidManifest.xmlคุณสมบัติของฉันActivity:

android:windowSoftInputMode="stateAlwaysHidden"

fragmentsผมคิดว่านี่เป็นวิธีที่ง่ายแม้ว่าคุณจะใช้

" stateAlwaysHidden " แป้นพิมพ์แบบนิ่มจะซ่อนอยู่เสมอเมื่อหน้าต่างหลักของกิจกรรมมีโฟกัสเข้า


สิ่งนี้ใช้ได้กับฉันทั้ง ScrollView และ RelativeLayout
iversoncru

ไม่ใช่เรื่องดีสำหรับชิ้นส่วนเนื่องจากคุณกำลังเชื่อมโยง "สถานะที่ซ่อนอยู่" กับกิจกรรมที่จะมีชิ้นส่วนทั้งหมดของคุณซึ่งหมายความว่าส่วนใด ๆ ที่คุณต้องการแสดงในกิจกรรมจะได้รับผลกระทบจากคุณสมบัติ (ไม่ใช่ใน "ต่อส่วน "พื้นฐาน).
Pelpotronic

11

หากคุณมีมุมมองอื่นเกี่ยวกับกิจกรรมของคุณเช่น a ListViewคุณสามารถทำได้:

ListView.requestFocus(); 

ใน onResume () ของคุณเพื่อจับโฟกัสจากไฟล์editText.

ฉันรู้ว่าคำถามนี้ได้รับคำตอบแล้ว แต่แค่ให้ทางเลือกอื่นที่เหมาะกับฉัน :)



4

ใช้สิ่งนี้ในรหัสกิจกรรมของคุณ:

@Override
public void onCreate(Bundle savedInstanceState) {

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

}

สิ่งนี้ไม่ได้ผลสำหรับฉัน - แป้นพิมพ์ยังคงโผล่ขึ้นมาเมื่อฉันเริ่มกิจกรรม
David Doria

คุณสามารถตรวจสอบลิงค์นี้จะใช้งานได้: stackoverflow.com/questions/18977187/…
Sujeet Kumar Gupta

3

ฉันมีปัญหาแบบจำลองแม้ว่าจะเปลี่ยนแท็บแป้นพิมพ์ก็โผล่ขึ้นมาโดยอัตโนมัติและยังคงใช้งาน 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

อาจมีการเพิ่มประสิทธิภาพโค้ดได้มากขึ้น


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

การใช้แฟรกเมนต์ .. โค้ดนี้ใช้เพื่อซ่อนแป้นพิมพ์ ... เมื่อแฟรกเมนต์เปิดอยู่หลีกเลี่ยงการโฟกัสที่แป้นพิมพ์ฟิลด์แก้ไขข้อความ ...
Sreelal S

2

ฉันพบวิธีง่ายๆนี้ที่ใช้ได้ผลสำหรับฉันตั้งค่าคุณสมบัติเหล่านี้ในเค้าโครงหลักของคุณ:

<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();

หวังว่าจะได้ผลสำหรับคุณ


1

นี่เป็นวิธีแก้ปัญหาที่ฉันใช้ไม่ใช่วิธีแก้ปัญหาที่ดีที่สุด แต่ใช้ได้ดีสำหรับฉัน

 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

น่าสนใจเอกสารนี้https://developer.android.com/training/keyboard-input/visibility.htmlระบุว่าเมื่อกิจกรรมเริ่มต้นและให้โฟกัสไปที่ช่องข้อความแป้นพิมพ์อ่อนจะไม่แสดง (จากนั้นไปที่ แสดงวิธีการแสดงแป้นพิมพ์หากคุณต้องการด้วยรหัสบางอย่าง)

ใน Samsung Galaxy S5 ของฉันนี่คือวิธีการทำงานของแอพของฉัน (ที่ไม่มีรายการรายการหรือรหัสเฉพาะ) - ไม่มีแป้นพิมพ์ที่นุ่มนวล อย่างไรก็ตามใน Lollipop AVD จะมีการแสดงแป้นพิมพ์อ่อนซึ่งขัดกับเอกสารที่ระบุไว้ข้างต้น

หากคุณได้รับพฤติกรรมนี้เมื่อทำการทดสอบใน AVD คุณอาจต้องการทดสอบบนอุปกรณ์จริงเพื่อดูว่าเกิดอะไรขึ้น


1

นี้มีคำตอบที่ดีบางอย่างที่โพสต์ต่อไปนี้: หยุด 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 และไม่มีปัญหาใด ๆ กับการช่วยสำหรับการเข้าถึงสำหรับสิ่งนี้


0

สิ่งนี้เกิดขึ้นเมื่อ EditText ของคุณได้รับ Focus โดยอัตโนมัติเมื่อคุณเริ่มกิจกรรม วิธีหนึ่งที่ง่ายและมั่นคงในการแก้ไขปัญหานี้คือการตั้งค่าโฟกัสเริ่มต้นไปที่มุมมองอื่น ๆ เช่นปุ่มเป็นต้น

คุณสามารถทำได้ใน XML เค้าโครงของคุณโดยไม่ต้องใช้รหัส ..


0

คำตอบที่ได้รับการยอมรับไม่ได้ผลสำหรับฉันนั่นคือเหตุผลที่ให้คำตอบวิธีแก้ปัญหาอาจเป็นประโยชน์!

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));

ตอนนี้คีย์บอร์ดเปิดแล้วสนุก :)


คำถามคือจะป้องกันไม่ให้แป้นพิมพ์เปิดได้อย่างไร
jk7


0

เพิ่มโค้ดด้านล่างที่ด้านบนของ XML กิจกรรมและตรวจสอบให้แน่ใจว่า View อยู่เหนือ EditText

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

0

android:focusableInTouchMode="true"

เพิ่มบรรทัดด้านบนเป็น xml EditTextหรือTextInputLayoutที่มีโฟกัสและทำให้เกิดไฟล์softInputKeyboardป๊อปอัป

สิ่งนี้ช่วยแก้ปัญหาให้เราได้และตอนนี้แป้นพิมพ์ไม่ป๊อปอัป


0

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));

สิ่งนี้ใช้ได้ผลสำหรับฉันคนส่วนอาจมีไวยากรณ์ที่แตกต่างกัน สิ่งนี้ใช้ได้กับกิจกรรม


คุณต้องระบุข้อ จำกัด สมมติฐานหรือความเข้าใจง่ายในคำตอบของคุณ ดูรายละเอียดเพิ่มเติมเกี่ยวกับวิธีตอบได้ที่ลิงค์นี้: stackoverflow.com/help/how-to-answer
Usama Abdulrehman

-1

หากมุมมองของคุณมี 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();

หากคุณทำเช่นนั้นแก้ไขข้อความจะได้รับโฟกัสและแป้นพิมพ์จะปรากฏขึ้น


ฉันทำสิ่งนี้แล้ว แต่แป้นพิมพ์ยังคงปรากฏขึ้นและโฟกัสอยู่ที่แก้ไขข้อความ
David Doria
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.