เมื่อใช้ AlertDialog.Builder กับ EditText Soft Keyboard จะไม่เด้งขึ้นมา


117

ฉันใช้AlertDialog.Builderเพื่อสร้างช่องป้อนข้อมูลโดยมี EditText เป็นวิธีการป้อนข้อมูล

น่าเสียดายที่ Soft Keyboard ไม่ปรากฏแม้ว่าEditTextจะอยู่ในโฟกัสเว้นแต่คุณจะแตะอีกครั้งอย่างชัดเจน

มีวิธีบังคับให้ป๊อปไหม

ฉันได้ลองทำสิ่งต่อไปนี้หลังจาก (AlertDialog.Builder) .show (); แต่ไม่มีประโยชน์

InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(input, InputMethodManager.SHOW_FORCED);

ใครก็ได้ช่วยหน่อย

ขอบคุณ !!


1
โปรดจัดรูปแบบซอร์สโค้ดของคุณ
philipp

จากนั้นฉันก็โหวตให้คุณเช่นกัน :) ฉันมีปัญหาเดียวกันในการค้นหาหลายชั่วโมงและคำตอบสุดท้ายจาก grine4ka ใช้งานได้ดี
ฟิลิปปินส์

คำตอบ:


222

ฉันได้ทำสิ่งนั้น

AlertDialog.Builder b = new AlertDialog.Builder(this);//....
AlertDialog dialog = b.create();

dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

dialog.show();

3
ขอบคุณมาก. ฉันค้นหามาสักพักแล้วและนี่คือทางที่คุณต้องการไป OnFocusChangeListenerวิธีการทั้งหมดดูเหมือนจะมากสำหรับฉันและก่อให้เกิดปัญหา คุณต้องสร้างAlertDialogจากAlertDialog.Builder!
philipp

อันนี้แก้ได้จริงหรือ? นี่เป็นเพียงการบังคับให้แป้นพิมพ์แสดงโดยไม่คำนึงว่าช่องป้อนข้อมูลมีโฟกัสหรือไม่ใช่ไหม =)
Ted

@Ted คุณพูดถูกอันนี้ไม่ใช่วิธีแก้ปัญหาที่แท้จริง แต่ใช้งานได้ฉันพยายามทำสิ่งนั้นแล้วหากไม่มีข้อความแก้ไขในกล่องโต้ตอบและแป้นพิมพ์อ่อนไม่ปรากฏขึ้น
grine4ka

1
ฉันจัดการเพื่อ "แก้ปัญหา" (วิธีแก้ปัญหาชั่วคราว) ฉันใช้ setOnFocusChangeListener สำหรับ EditText และใน onFocusChange หากตรวจสอบว่ามีโฟกัสหรือไม่ (ตัวแปร "hasFocus") และถ้าเป็นเช่นนั้นฉันจะ getWindow () setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
Ted

1
หมายเหตุ: เพื่อให้ได้ผลคุณต้องวางsetSoftInputModeสายก่อนมิ dialog.show()ฉะนั้นจะไม่ทำงาน +1 สำหรับวิธีแก้ปัญหาง่ายๆที่ถูกต้อง btw
Spikatrix

30

ฉันสามารถแก้ปัญหาได้ดังนี้:

Dialog = builder.create();
Dialog.show();
Dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE  | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
Dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

สิ่งนี้ได้ผลสำหรับฉัน
Ahmad Daudu Sulaiman

23

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

ฉันใช้สิ่งนี้รู้สึกสะอาดขึ้นมาก

AlertDialog d = builder.create();
d.getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
d.show();

ขอบคุณ SOFT_INPUT_STATE_ALWAYS_VISIBLEนี้จะต้องดีกว่าการใช้ ตามSOFT_INPUT_STATE_ALWAYS_VISIBLEกำลังจะปิดกั้นส่วนประกอบ UI ของกล่องโต้ตอบซึ่งSOFT_INPUT_ADJUST_RESIZEสามารถปรับขนาดและ "ดัน" กล่องโต้ตอบได้
Cheok Yan Cheng

10

ในกรณีของฉันวิธีเดียวที่ฉันสามารถแสดงแป้นพิมพ์เมื่อกล่องโต้ตอบถูกแสดงคือการเพิ่มในDialogFragment:

@Override
public void onResume() {
    super.onResume();
    getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    myEditText.requestFocus();
}

หมายเหตุSOFT_INPUT_STATE_ALWAYS_VISIBLEแทนSOFT_INPUT_STATE_VISIBLE

จากเอกสารประกอบ:

int SOFT_INPUT_STATE_ALWAYS_VISIBLE
Visibility state for softInputMode: please always make the soft input area visible when this window receives input focus.

นี่เป็นทางออกเดียวที่ใช้ได้ผลสำหรับฉันและฉันได้ลองโหลดพวกเขาแล้ว Mine เป็นไดอะล็อกบ็อกซ์บิวด์จากตัวสร้าง alertdialog บิตที่สำคัญดูเหมือนจะวางโค้ดด้านบนใน onResume () ที่อื่นมันไม่ได้ผล!
user960914

6

เมื่อคุณเรียก showDialog เพื่อแสดง Dialogue ที่สร้างโดยใช้ AlertDialog ใน onCreateDialog

คุณควรใส่รหัสที่นี่

    @Override
protected void onPrepareDialog (int id, Dialog dialog, Bundle args)
{
    TextView editText=(TextView) dialog.findViewById(R....);

    editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
       @Override
       public void onFocusChange(View v, boolean hasFocus) {
         if (hasFocus) {
            dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
         }
       }
    });

}

5

วิธีการแก้ปัญหาที่ดีมากที่จะได้รับที่นี่

dialog.getWindow().clearFlags(
         WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
        |WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

ไม่มีวิธีแก้ปัญหา EditTextทำงานตามที่คาดไว้


อันนี้ใช้ได้ผลสำหรับฉันวิธีแก้ปัญหาอื่นคือการนำโฟกัสมาใช้ แต่คีย์บอร์ไม่แสดง
Akshay


1

นี้ได้รับคำตอบที่นี่แล้ว การใช้ OnFocusChangeListener ทำงานให้ฉัน


คำถามจะถามถึงวิธีการตั้งค่าโหมดอินพุตแบบนุ่มนวลสำหรับออบเจ็กต์ AlertDialog.Builder อย่างไรก็ตามเธรดที่คุณอ้างถึงจะให้ตัวอย่างโดยใช้อ็อบเจ็กต์ AlertDialog ถ้าฉันพยายามใช้รหัสที่แนะนำ (โดยใช้ alert.getWindow (). setSoftInputMode (... ) ภายใน OnFocusChangeListener) วัตถุ Eclipse ที่วิธี getWindow () ไม่ได้กำหนดไว้สำหรับชนิด AlertDialog.Builder คุณช่วยฉันแก้ไขได้ไหม
prepbgg

1

ในกรณีของฉัน SoftInputMode ไม่ได้รับการแสดงเมื่อฉันตั้งค่าซึ่งเป็นก่อนที่จะแสดงกล่องโต้ตอบ (หลังจากสร้างแล้ว) รหัสด้านล่างใช้ได้กับฉันโดยที่ฉันตั้งค่า SoftInputMode หลังจากแสดงกล่องโต้ตอบ

Kotlin:

val dialog = MaterialAlertDialogBuilder(context) // Other builder code
                .create()
dialog.show()
dialog.window?.apply { // After the window is created, get the SoftInputMode
    clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)
    clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM)
    setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)
}

Java:

AlertDialog dialog = MaterialAlertDialogBuilder(getContext()) // Other builder code
                .create();
dialog.show();
Window window = dialog.getWindow();
if(window != null){ // After the window is created, get the SoftInputMode
    window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
    window.clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}

ฉันหวังว่านี่จะช่วยทุกคนที่ประสบปัญหาเดียวกับฉัน


0

ลองใช้มันได้ผลสำหรับฉัน

หากคุณต้องการแสดงซอฟต์คีย์บอร์ด:

InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.showSoftInput(input.getWindowToken(), 0);

และถ้าคุณต้องการซ่อนมัน:

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

0
final AlertDialog.Builder alert = new AlertDialog.Builder(context);

final AlertDialog dialog = alert.show();
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

1
ควรรวมบริบท / คำอธิบายบางส่วนไว้กับโค้ดเนื่องจากจะทำให้คำตอบมีประโยชน์มากขึ้นสำหรับ OP และผู้อ่านในอนาคต
EJoshuaS - คืนสถานะ Monica

0

ปัญหานี้เกิดขึ้นเมื่อมีการเพิ่ม EditText หลังจากเรียก AlertDialog.onCreate

https://developer.android.com/reference/androidx/appcompat/app/AlertDialog.Builder

คลาส AlertDialog จะดูแลการตั้งค่า android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM โดยอัตโนมัติสำหรับคุณโดยขึ้นอยู่กับว่ามุมมองใด ๆ ในกล่องโต้ตอบส่งคืนจริงจาก View.onCheckIsTextEditor ()

คุณต้องล้างแฟล็ก FLAG_ALT_FOCUSABLE_IM

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); 

เนื่องจาก AlertDialog.show ถูกเรียกใน DialogFragment.onStart คุณจึงสามารถแทรกรหัสใน DialogFragment.onStart

@Override
public void onStart() {
    super.onStart();
    getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
}

หรือคุณสามารถใช้ Dialog.setOnShowListener ถ้าคุณไม่ใช้ DialogFragment

dialog.setOnShowListener(new DialogInterface.OnShowListener() {
    @Override
    public void onShow(DialogInterface dialog) {
        getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    }
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.