ป้องกันไม่ให้คีย์บอร์ดแสดงเมื่อเริ่มกิจกรรม


265

ฉันมีกิจกรรมกับ Edit Textอินพุต เมื่อกิจกรรมเริ่มต้นขึ้นแป้นพิมพ์ Android จะปรากฏขึ้น แป้นพิมพ์จะยังคงซ่อนอยู่ได้อย่างไรจนกว่าผู้ใช้จะเน้นการป้อนข้อมูล


93
ในรายการของคุณ<activity android:windowSoftInputMode="stateHidden" ...>
idiottiger


1
จะใช้ร่วมกับได้android:windowSoftInputMode="adjustPan"อย่างไร?
Janos

4
@ János android: windowSoftInputMode = "adjustPan | stateHidden"
Alexey Strakh

คำตอบในความคิดเห็นนี้เป็นคำตอบที่ฉันกำลังมองหา: stackoverflow.com/a/23605510/6942602
korchix

คำตอบ:


436

ฉันคิดว่าสิ่งต่อไปนี้อาจใช้ได้

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

ฉันเคยใช้มันเพื่อสิ่งนี้มาก่อน


มีวิธีตั้งเป็นปุ่มกดแบบตัวเลขเท่านั้นหรือไม่ เช่นแป้นพิมพ์ 12Key?
Mohamed Khamis

@MohamedKhamis input.setRawInputType (การกำหนดค่า KEYBOARD_12KEY);
blockwala

1
ใช่มันยังใช้งานได้ @SagarNayak ทำไมคุณต้องการซ่อนแป้นพิมพ์เพื่อEditText? :) นี่คือการซ่อนแป้นพิมพ์เมื่อกิจกรรมเริ่มต้นซึ่งมีEditText
Martynas

@ Davealte 7 ปีต่อมาและมันใช้งานได้สำหรับฉันคุณวางไว้ใน onCreate ไหม?
Dymas

@Dymas ใช่แล้วและฉันเพิ่งซ่อมมันหลายเดือนที่ผ่านมา :)
22419

180

ลองสิ่งนี้ด้วย -

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

มิฉะนั้นประกาศในกิจกรรมไฟล์รายการของคุณ -

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

หากคุณใช้android:windowSoftInputModeค่าที่ต้องการadjustResizeหรือadjustPanคุณสามารถรวมสองค่าเช่น:

<activity
        ...
        android:windowSoftInputMode="stateHidden|adjustPan"
        ...
        >

การดำเนินการนี้จะซ่อนแป้นพิมพ์เมื่อใดก็ตามที่เหมาะสม แต่กวาดมุมมองกิจกรรมในกรณีที่ต้องแสดงแป้นพิมพ์


3
ขอบคุณที่แสดงทั้งในโค้ดและใน xml! แน่นอนนี่เป็นคำตอบที่ถูกต้องที่สุด! โดยเฉพาะอย่างยิ่งเพราะมันอาจจะเป็นที่ 3 นาทีที่คุณใช้เขียนทั้งสองวิธีที่ทำให้คุณไม่ได้เป็นครั้งแรก ;-)
eric

34

ซ่อนมันสำหรับกิจกรรมทั้งหมดโดยใช้ธีม

<style name="MyTheme" parent="Theme">
    <item name="android:windowSoftInputMode">stateHidden</item>
</style>

กำหนดธีม

<application android:theme="@style/MyTheme">

ชอบแนวทางระดับโลกนี้
Rm558

1
สิ่งนี้ทำงานได้เนื่องจากฉันใช้ธีมที่แตกต่างกันตามสถานที่ต่าง ๆ
nmxprime

22

เพิ่มคุณสมบัติทั้งสองนี้ให้กับโครงร่างหลักของคุณ (เช่น: Linear Layout, Relative Layout)

android:focusable="false"
android:focusableInTouchMode="false" 

มันจะทำเคล็ดลับ :)


2
สิ่งนี้ไม่ได้ผลสำหรับฉันอย่างไรก็ตามการตั้งค่าให้ใช้trueงานได้ตามคำตอบของ Jack T มีการเปลี่ยนแปลงพฤติกรรมในรุ่นล่าสุดหรือไม่?
Protean

นอกจากคำตอบของฉันคุณต้องตรวจสอบคุณสมบัติอื่น ๆ ที่คุณมีในรายการและสำหรับการแก้ไขข้อความ
ราชาแห่งมวลชน

ฉันเพิ่งมีคุณสมบัติพื้นฐานที่สุดในพวกเขา ฉันไม่เข้าใจว่าทำไมการตั้งค่าเหล่านี้falseจึงควรใช้งานได้เนื่องจากเป็นแนวคิดที่จะให้ความสำคัญกับช่อง EditText
Protean

บางทีใช้เพื่อให้ได้โฟกัสจากกล่อง EditText โดยทำให้มันห่างจากเลย์เอาต์หลัก แต่ไม่ใช่อีกต่อไปดูเหมือนว่า
Protean

13

พยายามที่จะประกาศในไฟล์ Menifest

<activity android:name=".HomeActivity"
      android:label="@string/app_name"
      android:windowSoftInputMode="stateAlwaysHidden"
      >



8

เพียงเพิ่มสิ่งนี้ในไฟล์ manifest.xml ของคุณ

<activity android:name=".MainActivity"
            android:windowSoftInputMode="stateHidden">

คุณทำเสร็จแล้ว


7

คุณยังสามารถเขียนบรรทัดของรหัสเหล่านี้ในโครงร่างพาเรนต์โดยตรงของไฟล์โครงร่าง. xml ที่คุณมี "ปัญหา":

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

ตัวอย่างเช่น:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    ...
    android:focusable="true"
    android:focusableInTouchMode="true" >

    <EditText
        android:id="@+id/myEditText"
        ...
        android:hint="@string/write_here" />

    <Button
        android:id="@+id/button_ok"
        ...
        android:text="@string/ok" />
</LinearLayout>


แก้ไข:

ตัวอย่างถ้า EditText อยู่ในเลย์เอาต์อื่น:

<?xml version="1.0" encoding="utf-8"?>
<ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    ... >                                            <!--not here-->

    ...    <!--other elements-->

    <LinearLayout
        android:id="@+id/theDirectParent"
        ...
        android:focusable="true"
        android:focusableInTouchMode="true" >        <!--here-->

        <EditText
            android:id="@+id/myEditText"
            ...
            android:hint="@string/write_here" />

        <Button
            android:id="@+id/button_ok"
            ...
            android:text="@string/ok" />
    </LinearLayout>

</ConstraintLayout>

กุญแจสำคัญคือการทำให้แน่ใจว่า EditText ไม่สามารถโฟกัสได้โดยตรง
บาย! ;-)


6

ทางออกที่ดีที่สุดสำหรับฉันวางชั้นเรียนของคุณ

@Override
public void onResume() {
    this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    super.onResume();
}

@Override
public void onStart() {
    this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    super.onStart();
}

3

ฟังก์ชั่นเพื่อซ่อนคีย์บอร์ด

public static void hideKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();

    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);

        inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
}

ซ่อนแป้นพิมพ์ในไฟล์ AndroidManifext.xml

<activity
    android:name=".MainActivity"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"
    android:windowSoftInputMode="stateHidden">

3

หากต้องการขยายคำตอบที่ได้รับการยอมรับโดย @Lucas:

เรียกสิ่งนี้จากกิจกรรมของคุณในหนึ่งในกิจกรรมวัฏจักรชีวิตยุคต้น:

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

ตัวอย่าง Kotlin:

override fun onResume() {
  super.onResume()

  window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN)
}

2

คุณสามารถลองใช้ชุดคุณลักษณะที่เป็นเอกลักษณ์สำหรับแต่ละองค์ประกอบ

TextView mtextView = findViewById(R.id.myTextView);
mtextView.setShowSoftInputOnFocus(false);

แป้นพิมพ์จะไม่แสดงในขณะที่องค์ประกอบโฟกัสอยู่


แม้ว่าสิ่งนี้อาจตอบคำถามผู้แต่ง แต่ก็ไม่มีคำอธิบายและ / หรือลิงก์ไปยังเอกสารประกอบ ตัวอย่างโค้ดดิบนั้นไม่ค่อยมีประโยชน์หากไม่มีวลีอยู่รอบตัว คุณอาจพบว่าวิธีการเขียนคำตอบที่ดีมีประโยชน์มาก โปรดแก้ไขคำตอบของคุณ - จากรีวิว
Nick

1
//to hide the soft keyboard
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);

0

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

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
      if (getCurrentFocus() != null) {
           InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
           imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
      }
      return super.dispatchTouchEvent(ev);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.