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


237

สำหรับอุปกรณ์ Android ที่ใช้แป้นพิมพ์อ่อนฉันต้องการป้องกันไม่ให้มุมมองการแก้ไขแป้นพิมพ์เต็มหน้าจอ (แสดงด้านล่าง) ปรากฏเมื่ออยู่ในโหมดแนวนอน (เช่นฉันต้องการเห็นเฉพาะแป้นพิมพ์นุ่มและมุมมองของฉันเท่านั้น)

ฉันคิดว่าสิ่งนี้สามารถทำได้โดยใช้setExtractViewShown(false)วิธีการในInputMethodServiceแต่ฉันไม่สามารถเข้าถึงอินสแตนซ์เริ่มต้นของเรื่องนี้และไม่ต้องการที่จะใช้วิธีการป้อนข้อมูลที่กำหนดเอง

มุมมองการแก้ไขแบบเต็มหน้าจอ Android

แก้ไขเพื่อเพิ่ม:มุมมองที่อินพุตกำลังจะไม่ใช่TextView(เป็นการใช้ViewกับการปรับInputConnectionใช้แบบกำหนดเอง) ดังนั้นandroid:imeOptions="flagNoExtractUi"จะไม่ทำงานที่นี่


ลองไปดูกัน ดีสำหรับคุณ. [ดูสิ่งนี้] [1] [1]: stackoverflow.com/questions/8648401/…
sonida

ฉันมีปัญหาที่คล้ายกัน :( คุณอาจมีความคิดใด ๆ หรือไม่stackoverflow.com/questions/36914290/…
railwanderer

2
วิธีการใช้สิ่งนี้ตลอดทั้งแอปเราจะไม่เพิ่ม attribute-value ในทุก edittext ใน xml
Vikas Pandey

2
หลายคำตอบดังต่อไปนี้ขอแนะนำให้ใช้หรือflagNoExtractUi IME_FLAG_NO_EXTRACT_UIอย่างไรก็ตามในเอกสารประกอบสำหรับIME_FLAG_NO_EXTRACT_UIซึ่งสอดคล้องกับflagNoExtractUiมันระบุว่า "การใช้ธงนี้เป็นกำลังใจและมันอาจกลายเป็นเลิกในอนาคต" ดังนั้นflagNoFullscreenตัวเลือกที่แนะนำคือ
ThomasW

คำตอบ:


178

ในที่สุดฉันก็ตอบคำถามของฉันเอง:

แยก UI (เช่นโหมดแก้ไขเต็มหน้าจอ) สามารถปิดการใช้งาน ณ จุดที่การเชื่อมต่ออินพุตถูกเชื่อมต่อ:

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {

    outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_EXTRACT_UI;

    // etc.
}

215
เพียงแค่ใส่ไฟล์ xml ใน android ของคุณ: imeOptions = "flagNoExtractUi"

1
jnic คุณทำอย่างนั้นแทนที่ที่ในรหัสคีย์บอร์ดนุ่ม? SoftKeyboard.java? ฉันลองแทนที่เดิมและ error'd

14
คุณอาจต้องการเพิ่มการตั้งค่าสถานะในตัวเลือกแทนการเอาชนะตัวเลือกที่เคยผ่านในลักษณะนี้:outAttrs.imeOptions |= EditorInfo.IME_FLAG_NO_EXTRACT_UI;
ObsidianX

2
@ user726518 วิธีการใช้คุณลักษณะนี้ในรายการช่องค้นหาในแถบการกระทำ?
Menna-Allah Sami

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

109

ในการทำเช่นนั้นให้ไปที่กิจกรรม xml และวางandroid:imeOptions="flagNoExtractUi"รหัสของคุณ แต่มันควรจะวางที่ไหน? ดูรหัสตัวอย่างกิจกรรม xml และดูที่ EditText:

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

    <EditText
        android:imeOptions="flagNoExtractUi"
        android:id="@+id/etTextInAct"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10" >   
        <requestFocus />
    </EditText>

</LinearLayout>

หากคุณต้องการตัวเลือกการปรับแต่งเพิ่มเติมสำหรับแป้นพิมพ์โปรดดูที่http://developer.android.com/guide/topics/ui/controls/text.html


64

เพิ่มคุณสมบัติandroid:imeOptions="flagNoExtractUi"ให้กับแต่ละไฟล์EditTextของคุณXML


1
คำตอบนี้สั้นเกินไปและไม่ตรงตามมาตรฐานคุณภาพดังนั้น โปรดปรับปรุงด้วยการเพิ่มคำอธิบายเพิ่มเติมเพื่อที่จะเป็นประโยชน์สำหรับชุมชนและไม่เพียง แต่สำหรับ OP
Lorenzo Donati - Codidact.org

31
@ LorenzoDonati มันเป็นสิ่งที่คุณต้องทำ ... มันเป็นคำตอบที่ง่ายมากเพราะวิธีแก้ปัญหานั้นง่ายมากและมันก็เป็นวิธีการที่แตกต่างจากคำตอบข้างต้น นอกจากนี้คำตอบจะต้องไม่ "สั้นเกินไป" หากไม่ตอบคำถาม IMO
Michael Yaworski

1
ขออภัยนี่ไม่ใช่สิ่งที่ชุมชน SO คิดเกี่ยวกับมัน คำตอบไม่ควรถูก จำกัด เพื่อแก้ปัญหาของ OP แต่ควรเป็นคำตอบที่ดีโดยทั่วไป ดูสิ่งนี้และสิ่งนี้เช่น
Lorenzo Donati - Codidact.org

22
@ LorenzoDonati เป็นคำถามที่เจาะจงมากโดยมีเพียงผลลัพธ์เดียวเท่านั้น (แต่สามารถแก้ไขได้หลายวิธี) คำตอบของฉันคือการเพิ่มไปยังคำตอบอื่น ๆ ในหน้านี้ ทุกคำตอบในหน้านี้ถูก จำกัด อยู่เพียงใน "ปัญหาของ OP" เพราะนั่นเป็นเพียงชนิดของคำตอบที่สามารถเขียนได้ อย่างที่ฉันบอกไปมันเจาะจงและเรียบง่าย
Michael Yaworski

2
ในที่สุดฉันก็พบคำตอบ ขอบคุณมาก @mike yaworski
Drx

53

คำตอบข้างต้นช่วยฉันหาวิธีแก้ไข EditTexts ที่เพิ่มเข้ามาแบบไดนามิก:

editText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);

37

ใช้android:imeOptions="flagNoFullscreen"เพื่อให้ได้คุณสมบัตินั้น


1
วิธีที่ดีและดีกว่าในการเขียนใน xml ใช้งานได้สำหรับฉัน ขอบคุณ
Ahesanali Suthar

1
โปรดทราบว่าในเอกสารประกอบสำหรับIME_FLAG_NO_EXTRACT_UIซึ่งสอดคล้องกับflagNoExtractUiมันระบุว่า "การใช้ธงนี้เป็นกำลังใจและมันอาจกลายเป็นเลิกในอนาคต" ดังนั้นflagNoFullscreenตัวเลือกที่แนะนำคือ
ThomasW

12

นอกจากนี้หากคุณต้องการรวมโปรแกรม imeOptions หลายรายการไว้คุณสามารถใช้ | วากยสัมพันธ์

ตัวอย่างเช่นในการปิดการใช้งานมุมมองการแก้ไขแบบเต็มหน้าจอในแนวนอนและแทนที่คีย์ "ถัดไป" ด้วย "ตกลง" (ACTION_DONE) ในแป้นพิมพ์คุณสามารถใช้:

editText.setImeOptions(EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI);

9

หากคุณกำลังปรับเปลี่ยน IME โดยตรงคุณสามารถป้องกันไม่ให้แสดง ExtractedView โดยการแทนที่onUpdateExtractingVisibility:

@Override
public void onUpdateExtractingVisibility(EditorInfo ei) {
    ei.imeOptions |= EditorInfo.IME_FLAG_NO_EXTRACT_UI;
    super.onUpdateExtractingVisibility(ei);
}

6

ฉันรู้ว่ามันช้าไปหน่อย แต่สำหรับผู้ที่สนใจยังคงนี่คือคำตอบของฉัน: ในกรณีของฉันฉันมีภูมิทัศน์กิจกรรมที่มีEditTextที่ด้านบนของมันและฉันต้องการที่จะใช้คุณลักษณะการเติมข้อความอัตโนมัติในการค้นหานี้กิจกรรมซึ่งทับซ้อน แป้นพิมพ์ที่เกิดจากปัญหาที่ผู้ใช้ไม่สามารถมองเห็นผลมาจากการRecyclerView ดังนั้นฉันสิ้นสุดการมีEditTextนี้ในเค้าโครงของฉัน:

<EditText
  android:layout_width="match_parent"
  android:layout_height="?actionBarSize"
  android:id="@+id/main_search_et"
  android:imeOptions="actionSearch|flagNoExtractUi"
  android:inputType="text"  />

ไชโย!



2

คุณสามารถใช้ได้ :

android:imeOptions="flagNoFullscreen" 

ใน edittext ของคุณ


1
นี่เป็นคำตอบใช่ไหม
artgb

ฉันลองแล้วมันใช้ได้ผลสำหรับฉัน! (อุปกรณ์ของฉันคือ android 4.1.2)
Thientvse

0

คุณสามารถโทรเพื่อซ่อนคีย์บอร์ดอ่อนและโฟกัสชัดเจนจากการค้นหา

public void hideKeyboard(View view) {
    InputMethodManager imm = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

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