AlertDialog-显示带有自定义类的软键盘不起作用

时间:2019-12-29 21:18:58

标签: android android-alertdialog android-softkeyboard

我的问题是我的自定义alertdialog类未正确显示软键盘。我正在使用

创建它
SettingsDialog settingsDialog = new SettingsDialog(MainActivity.this);
settingsDialog.show();

软键盘没有显示。我已遵循其他stackoverflow答案来显示键盘... Show soft keyboard for dialog

如果我不使用自定义类,则可以使用

AlertDialog.Builder mBuilder = new AlertDialog.Builder(MainActivity.this);
mBuilder.setView(R.layout.alertdialog_settings);
AlertDialog alertDialog = mBuilder.create();
alertDialog.show();

enter image description here

但是,当使用自定义AlertDialog类时,我似乎无法获得与上图相同的结果

我尝试手动显示键盘

SettingsDialog settingsDialog = new SettingsDialog(MainActivity.this);
settingsDialog.show();
InputMethodManager imm = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
if(imm != null){
   imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
}

enter image description here

但是它显示了Alertdialog后面的键盘,并且效果与AlertDialog Builder不同。

如何使用“自定义AlertDialog”显示软键盘,使其具有与AlertDialog Builder一样的输出?

修改:

我也尝试过在AlertDialog的onCreate方法中手动显示它

 public SettingsDialog(@NonNull Context context, String subName) {
        super(context);
        this.mContext = context;
        this.mSubName = subName;

}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.alertdialog_settings);

    InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
    if(imm != null){
      imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
    }

}

但是,这仍然会使键盘显示在alertDialog后面

3 个答案:

答案 0 :(得分:4)

我尝试了许多其他方法,但是这种方法终于可以了。

SortByDialog sortByDialog = new SortByDialog(MainActivity.this);
sortByDialog.show();
sortByDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
|WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

需要确保自定义AlertDialogClass的clearFlags在.show()之后

答案 1 :(得分:4)

我认为您不需要扩展Alert Dialog类,您可以做的只是创建一个包含帮助程序功能的自定义Java,即可创建自定义对话框,因此您仍将具有代码抽象功能,并可以轻松添加其他功能。

public class SettingsDialog  {

  private  AlertDialog.Builder mBuilder = null;
  private  AlertDialog alertDialog = null;

 public SettingsDialog(@NonNull Context context, String subName) {
        this.mSubName = subName;
        this.mContext = context;
 }

 public show(){
    mBuilder = new AlertDialog.Builder(mContext);
    mBuilder.setView(R.layout.someID);
    alertDialog = mBuilder.create();
    alertDialog.show();
 }

 public void dismiss(){
    if(alertDialog == null) return;
    alertDialog.dismiss();
 }

 // can use interface to handle callbacks

}


// usage 

SettingsDialog sd = new SettingsDialog(this, "MATHS");
sd.show();
//sd.dismiss();

答案 2 :(得分:-1)

尝试显示键盘有些延迟е.g.对话框创建后100-200ms,或者尝试使用EditText.requestFocus()请求对话框的EditText焦点,对话框创建后也会延迟。