khi sử dụng AlertDialog.Builder với EditText, Bàn phím mềm không bật


117

Tôi đang sử dụng AlertDialog.Builder để tạo hộp nhập liệu, với EditText làm phương thức nhập.

Thật không may, Bàn phím mềm không bật lên, mặc dù EditText nằm trong tiêu điểm, trừ khi bạn chạm vào nó một cách rõ ràng.

Có cách nào để buộc nó bật lên không?

Tôi đã thử cách sau, sau (AlertDialog.Builder) .show (); nhưng vô ích.

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

Bất cứ ai có thể giúp đỡ?

Cảm ơn!!


1
vui lòng định dạng mã nguồn của bạn.
philippe

Sau đó, tôi upvote bạn cũng :) Tôi đã tìm kiếm cùng một vấn đề cho nhiều giờ và câu trả lời cuối cùng từ grine4ka hoạt động tuyệt vời
Philipp

Câu trả lời:


222

Tôi đã làm một điều như vậy

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

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

dialog.show();

3
Cảm ơn bạn rất nhiều. Tôi đã tìm kiếm trong một thời gian và đây là con đường bạn muốn đi. Tất cả các OnFocusChangeListenercách tiếp cận dường như nhiều đối với tôi và gây ra rắc rối. Bạn phải tạo AlertDialogtừ AlertDialog.Builder!
philippe

Đây có thực sự là một giải pháp? Điều này chỉ buộc bàn phím hiển thị, bất kể có trường nhập hay không, không quan tâm đến trường nhập có tiêu điểm hay không, phải không? =)
Ted

@Ted bạn nói đúng, đây không phải là giải pháp thực sự, nhưng nó hoạt động. Tôi đã cố gắng làm điều đó nếu không có văn bản chỉnh sửa trong hộp thoại và bàn phím mềm không xuất hiện.
grine4ka

1
Tôi thực sự quản lý để "giải quyết nó" (cách giải quyết). Tôi sử dụng setOnFocusChangeListener cho EditText và trong onFocusChange nếu kiểm tra xem nó có tiêu điểm không (var "hasFocus") và nếu có, tôi getWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
Ted

1
Lưu ý: Để điều này hoạt động, bạn cần đặt setSoftInputModedòng trước dialog.show() nếu không nó sẽ không hoạt động. +1 cho giải pháp chính xác đơn giản btw
Spikatrix 21/12/18

29

Tôi đã quản lý để giải quyết nó như thế này:

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

23

Tôi phát hiện ra rằng mã tương tự hoạt động bình thường trên Máy tính bảng, bàn phím bật lên, nhưng trên Điện thoại thì không, vì vậy, nghiên cứu thêm, dường như chỉ ra tùy chọn "điều chỉnh".

Tôi đang sử dụng cái này, cảm thấy sạch hơn nhiều.

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

Cảm ơn. Điều này phải tốt hơn là sử dụng SOFT_INPUT_STATE_ALWAYS_VISIBLE. Như SOFT_INPUT_STATE_ALWAYS_VISIBLEsẽ chặn các thành phần giao diện người dùng của hộp thoại, nơi SOFT_INPUT_ADJUST_RESIZEcó thể thay đổi kích thước và "đẩy lên" hộp thoại.
Cheok Yan Cheng

10

Trong trường hợp của tôi, cách duy nhất tôi có thể hiển thị bàn phím khi Hộp thoại được hiển thị là thêm vào 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();
}

Lưu ý SOFT_INPUT_STATE_ALWAYS_VISIBLE thay vì SOFT_INPUT_STATE_VISIBLE .

Từ tài liệu:

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

Đây là giải pháp duy nhất phù hợp với tôi và tôi đã thử LOADS trong số đó. Của tôi là một bản dựng phân đoạn hộp thoại từ trình tạo alertdialog. Bit quan trọng dường như đang đặt đoạn mã trên trong onResume (). Bất cứ nơi nào khác nó chỉ không hoạt động!
user960914

6

Khi bạn gọi showDialog để hiển thị Đối thoại được tạo bằng AlertDialog trong onCreateDialog

Bạn nên đặt mã ở đây

    @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

Một giải pháp tốt hơn nhiều được đưa ra ở đây .

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

Không có giải pháp thay thế. EditTextcư xử như mong đợi.


Giải pháp này phù hợp với tôi, giải pháp khác mang lại tiêu điểm nhưng keybord không được hiển thị.
Akshay

2
Window window = dialog.getWindow();
    window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

1

Điều này đã được trả lời ở đây rồi. Sử dụng OnFocusChangeListener phù hợp với tôi.


Câu hỏi hỏi cách đặt chế độ nhập mềm cho một đối tượng AlertDialog.Builder, tuy nhiên, chuỗi mà bạn tham khảo đưa ra một ví dụ bằng cách sử dụng một đối tượng AlertDialog. Nếu tôi cố gắng sử dụng mã được đề xuất (sử dụng alert.getWindow (). SetSoftInputMode (...) trong OnFocusChangeListener) các đối tượng Eclipse mà phương thức getWindow () không được xác định cho loại AlertDialog.Builder. Bạn có thể giúp tôi sửa lỗi này được không?
prepbgg

1

Trong trường hợp của tôi, SoftInputMode không được hiển thị khi tôi đặt nó trước khi hiển thị hộp thoại (sau khi tạo). Đoạn mã dưới đây phù hợp với tôi khi tôi đặt SoftInputMode sau khi hiển thị hộp thoại.

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

Tôi hy vọng điều này sẽ giúp bất kỳ ai đang gặp phải vấn đề giống như tôi.


0

Hãy thử cái này, nó hiệu quả với tôi

Nếu bạn muốn hiển thị bàn phím mềm:

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

Và nếu bạn muốn ẩn nó:

  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
Tốt hơn nên bao gồm một số ngữ cảnh / giải thích với mã vì điều này làm cho câu trả lời hữu ích hơn cho OP và cho những người đọc trong tương lai.
EJoshuaS - Khôi phục Monica

0

Sự cố này xảy ra khi EditText được thêm vào sau khi AlertDialog.onCreate được gọi.

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

Lớp AlertDialog đảm nhận việc tự động thiết lập android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM cho bạn dựa trên việc bất kỳ chế độ xem nào trong hộp thoại trả về true từ View.onCheckIsTextEditor ().

Bạn cần xóa cờ FLAG_ALT_FOCUSABLE_IM.

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

Vì AlertDialog.show được gọi trong DialogFragment.onStart, bạn có thể chèn mã vào DialogFragment.onStart.

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

Hoặc bạn có thể sử dụng Dialog.setOnShowListener nếu bạn không sử dụng DialogFragment.

dialog.setOnShowListener(new DialogInterface.OnShowListener() {
    @Override
    public void onShow(DialogInterface dialog) {
        getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    }
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.