แป้นพิมพ์บนหน้าจอ Android ปรากฏขึ้นโดยอัตโนมัติ


140

หนึ่งในแอพของฉันมี "หน้าจอเปิด" (โดยทั่วไปคือเมนู) ที่EditTextตามมาด้วยหลายButtonๆ ปัญหาคือว่าหลายผู้ใช้ของฉันมีการรายงานว่าเมื่อพวกเขาเปิด app มัน popping EditTextขึ้นโดยอัตโนมัติแป้นพิมพ์บนหน้าจอโดยไม่ต้องพวกเขาได้สัมผัส เท่าที่ผมสามารถบอกได้ทั้งหมดของผู้ใช้เหล่านี้จะถูกใช้HTC Hero

นี่เป็นข้อบกพร่องใน 1.5 หรือไม่? มีอะไรที่ฉันทำได้บ้างไหม?


1
ถ้ามันเป็นบั๊กมันก็คงอยู่ใน Sprint Hero โดยเฉพาะ Sprint มี Android รุ่น buggy บน Heros ที่พวกเขาขายและดูเหมือนว่าพวกเขาจะรีบออกมาแก้ไขบั๊ก มีความแตกต่างในพฤติกรรมระหว่าง Sprint Heros และอุปกรณ์ Android อื่น ๆ ทั้งหมด เท่าที่ฉันรู้ฮีโร่รุ่นอื่นเช่นในยุโรปไม่มีปัญหาเหล่านี้
ทำเครื่องหมาย B

โชคไม่ดีที่ฮีโร่ของที่นี่ในยุโรปมีปัญหาสำคัญพวกมันเปลี่ยนไปตามจำนวนบิวด์ แต่เราเจอข้อผิดพลาดหลัก 3 - 4 ตัว
Donal Rafferty

คำตอบ:


279

คุณสามารถใช้บรรทัดของรหัสต่อไปนี้ในวิธีการ onCreate ของกิจกรรมเพื่อให้แน่ใจว่าแป้นพิมพ์จะปรากฏขึ้นเฉพาะเมื่อผู้ใช้คลิกเข้าไปใน EditText

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 

สิ่งนี้ใช้ไม่ได้สำหรับฉัน (2.2 MyTouch 3G) ในเมธอด onCreate () ของฉันฉันเรียกใช้ setSoftInputMode () EditText ยังทำให้คีย์บอร์ดแสดง :(
เนท

สิ่งนี้ใช้ได้สำหรับฉัน ฉันใช้ Android 2.3.4 และกำลังพัฒนาโดยใช้ <uses-sdk android: minSdkVersion = "3" />
Sandy

78
หรือการใช้งานandroid:windowSoftInputMode="stateHidden"เหมือนที่นี่
Swato

ดังนั้นสิ่งที่ทำให้ฉันสับสนคือฉันมีกิจกรรมการเข้าสู่ระบบที่ดูเหมือนว่าซ่อนคีย์บอร์ดได้ดีอยู่แล้ว ฉันได้ทำกิจกรรมลงทะเบียนแล้วเช่นกัน แต่แป้นพิมพ์ก็ปรากฏขึ้นตามค่าเริ่มต้น ดังนั้นการเข้าสู่ระบบจึงหลีกเลี่ยงสิ่งนี้ได้อย่างไร ฉันไม่พบ setSoftInputMode ในกิจกรรมการเข้าสู่ระบบหรือแอตทริบิวต์ windowSoftInputMode ใน activity.xml
Chucky

ไม่ทำงานเสมอ: ในอุปกรณ์บางชนิด SOFT_INPUT_STATE_ALWAYS_HIDDEN ทำให้เกิดข้อผิดพลาดที่ข้อความแก้ไขที่ไม่ใช่ครั้งสุดท้ายในกิจกรรมไม่สามารถทำให้คีย์บอร์ดนุ่มปรากฏขึ้น ใช้ "android: windowSoftInputMode =" stateHidden "" ในไฟล์ Manifest ก็มีผลเหมือนกัน ผู้พัฒนาเอกสารระบุว่าคีย์บอร์ดนุ่มนวลจะไม่ปรากฏขึ้นโดยอัตโนมัติเว้นแต่จะถูกบังคับ แต่นั่นเป็นเพียงความผิดปกติเท่านั้น

85
<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".Main"
              android:label="@string/app_name"
              android:windowSoftInputMode="stateHidden"
              >

ใช้งานได้กับ Android 3.0, 3.1, 3.2, 4.0 - เครื่องมือแก้ไขที่ใช้ในการรวบรวม (Eclipse 3.7)

วาง 'windowSoftInputMode = "stateHidden"' ในไฟล์ XML ของแอปพลิเคชันของคุณสำหรับกิจกรรม EACH ที่คุณต้องการให้คีย์บอร์ดซอฟต์แวร์ยังคงซ่อนอยู่นั่นหมายความว่าคีย์บอร์ดจะไม่ปรากฏขึ้นโดยอัตโนมัติและผู้ใช้จะต้องคลิก 'a' ช่องข้อความที่จะนำมาขึ้น ฉันค้นหาสิ่งที่ใช้งานได้เกือบชั่วโมงเพื่อคิดว่าฉันจะแบ่งปัน


ทางออกที่ดีที่สุดที่ฉันพบ เน้นฟิลด์โดยไม่ต้องเปิดแป้นพิมพ์ ใช้งานได้กับ Nexus S พร้อม 4.1.2
alexismorin

1
android: windowSoftInputMode = "stateHidden | adjustNothing" ยังมีประโยชน์หากคุณใช้แฟรกเมนต์และคุณไม่ต้องการให้แป้นพิมพ์เปลี่ยนเค้าโครง
Whyoz

6

เพิ่มสิ่งนี้ในAndroidManifest.xmlของคุณ:

android:windowSoftInputMode="stateHidden|adjustResize"

มันทำงานได้อย่างสมบูรณ์ :)


1
ขอบคุณสำหรับคำตอบ ฉันขอโทษฉันจะโทรหาแป้นพิมพ์ได้อย่างไร requestFocus()มันจะไม่ปรากฏขึ้นเมื่อมีการโทร
Takesi Tokugawa YD

6

รหัสนี้จะทำงานกับ Android ทุกรุ่น:

@Override
 public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_login);

 //Automatic popping up keyboard on start Activity

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

 or

 //avoid automatically appear android keyboard when activity start
     getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
 }

บวก 1 สำหรับการบอกว่าป๊อปอัป
โปรแกรมเมอร์ของแอปปีศาจ

4

เพิ่มในเลย์เอาต์หลักของ XML

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

มันทำให้แน่ใจว่าโฟกัสไม่ได้อยู่บน editText เมื่อกิจกรรมเริ่มขึ้น


3

คุณสามารถใช้วิธีนี้ในเมธอด onCreate () ของกิจกรรม

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 

หรือวางรหัสนี้ในแท็กกิจกรรมใน AndroidManifest.xml

android:windowSoftInputMode="stateVisible"

2
ฉันคิดว่าคุณหมายถึง "stateHidden" มากกว่า "stateVisible"
stevehs17

2

คุณสามารถเพิ่มรหัสบรรทัดเดียวในAndroid Mainfest.xmlภายใต้แท็กกิจกรรม

 <activity
        android:name="com.sams.MainActivity"
        android:windowSoftInputMode="stateVisible" >
 </activity>

สิ่งนี้อาจช่วยคุณได้


1

ใน Android เวอร์ชันนั้นเมื่อมุมมองขยายเกินจริงโฟกัสจะถูกตั้งค่าเป็นตัวควบคุมที่สามารถโฟกัสได้ครั้งแรกตามค่าเริ่มต้น - และหากไม่มีแป้นพิมพ์จริงแป้นพิมพ์บนหน้าจอจะปรากฏขึ้น

ในการแก้ไขปัญหานี้ให้กำหนดโฟกัสที่อื่นอย่างชัดเจน หากตั้งโฟกัสไว้ที่สิ่งอื่นนอกเหนือจาก EditText คีย์บอร์ดบนหน้าจอจะไม่ปรากฏขึ้น

คุณลองทดสอบสิ่งนี้โดยใช้ Android 1.5 ในโปรแกรมจำลองหรือไม่?


ฉันลองในอีมูเลเตอร์ (และทำมันอีกครั้งเพื่อให้แน่ใจว่าฉันไม่ได้บ้า) มันทำหน้าที่ "ถูกต้อง" (หมายถึงไม่มีป๊อปอัปแป้นพิมพ์) นอกจากนี้เมื่อฉันแรกเริ่มเขียนสิ่งนี้ว่า G1 ของฉันทำงาน 1.5 และมันไม่ได้ทำแบบนี้ (เมื่อแป้นพิมพ์ถูก "ซ่อน")
Jeremy Logan

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

มีวิธีใดที่จะให้ความสนใจ "ไม่มีอะไร"?
Jeremy Logan

1
สิ่งนี้ใช้ไม่ได้สำหรับฉัน (2.2 MyTouch 3G) ในเมธอด onCreate () ของฉันฉันเรียก callFocus () อย่างชัดเจนบนปุ่มซึ่งเป็นวิดเจ็ตที่สองในมุมมอง EditText ยังทำให้แป้นพิมพ์แสดง :(
เนท

1

คุณสามารถทำได้โดยทางโปรแกรมชอบ

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editTextField.getWindowToken(), 0);

หรือตั้งandroid:windowSoftInputMode="stateHidden"อยู่<activity tagภายในAndroidManifest.xml


1

รวมสิ่งนี้เมื่อการนำเข้าอยู่ด้านบน:

import android.view.WindowManager;

เพิ่มรหัสนี้ในส่วน OnCreate:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ....
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
}

0
InputMethodManager imm = (InputMethodManager)GetSystemService(Context.InputMethodService);
        imm.ShowSoftInput(_enterPin.FindFocus(), 0);

* นี่สำหรับ Android.xamarin และ FindFocus () - มันจะค้นหามุมมองในลำดับชั้นที่รูทที่มุมมองนี้ซึ่งมีโฟกัสอยู่ในขณะนี้เนื่องจากฉันมี _enterPin.RequestFocus () หน้ารหัสข้างต้นจึงแสดงแป้นพิมพ์สำหรับ _enterPin EditText *

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