【问题标题】:AlertDialog - Show soft keyboard with a custom class not workingAlertDialog - 显示自定义类的软键盘不起作用
【发布时间】:2019-12-29 21:18:58
【问题描述】:

我的问题是我的自定义 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();

但是,当使用自定义 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);
}

但是,它在 alertdialog 后面显示键盘,并没有提供与 AlertDialog Builder 相同的效果。

如何使用自定义 AlertDialog 显示软键盘,以便像使用 AlertDialog Builder 一样输出?

编辑:

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

public class SettingsDialog extends AlertDialog {
     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 后面

【问题讨论】:

  • 你能公开设置对话框吗?
  • 公共设置对话框?
  • 是的,完整的代码类 SettingsDialog
  • 只是构造函数和Edit Above中的onCreate方法^
  • SettingsDialog 扩展 Dialog ?

标签: android android-alertdialog android-softkeyboard


【解决方案1】:

我认为您不需要扩展 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();

【讨论】:

  • 这也有效:) 我会说这是一个更好的解决方案。将您的标记为正确
  • @davids。总是乐于提供帮助。但我想知道,我什么时候会收到赏金?
  • @AbhishekGarg..你能帮帮我吗 --> stackoverflow.com/questions/59532667/…
  • 我想明天赏金什么时候结束?
  • @Wini 当然,让我看看。
【解决方案2】:

我尝试了许多其他方法,但这个方法终于奏效了。

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

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

【讨论】:

    【解决方案3】:

    尝试延迟显示键盘,例如对话框创建后 100-200 毫秒,或者只是尝试使用 EditText.requestFocus() 为对话框的 EditText 请求焦点,在对话框创建后也有延迟。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-04
      • 1970-01-01
      • 2020-09-20
      • 2011-07-28
      • 2015-08-16
      • 1970-01-01
      • 2012-09-24
      • 2019-01-05
      相关资源
      最近更新 更多