简体   繁体   中英

AlertDialog - Show soft keyboard with a custom class not working

My issue is that my custom alertdialog class is not displaying the softkeyboard correctly. I am creating it using

SettingsDialog settingsDialog = new SettingsDialog(MainActivity.this);
settingsDialog.show();

And the softkeyboard is not displaying. I've followed other stackoverflow answers to displaying the keyboard ... Show soft keyboard for dialog

and it works if I do not use a custom class

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

在此处输入图片说明

However when using a custom AlertDialog class I can't seem to get the same outcome as the picture above

I have tried manually displaying the keyboard

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

在此处输入图片说明

However it shows the keyboard behind the alertdialog and doesn't give the same effect as AlertDialog Builder.

How can I display the softkeyboard using a Custom AlertDialog to have output as using AlertDialog Builder?

Edit:

I have also tried manually displaying it in the AlertDialog's onCreate Method

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

     }
}

However this still causes the keyboard to be displayed behind the alertDialog

I've tried many other methods but this one finally works.

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

Need to make sure the clearFlags is after the .show() for your custom AlertDialogClass

I think you do not need to extend the Alert Dialog class, what you can do is simply a your custom java which contain helper function create your custom dialog, so you will still have code abstraction and can add additional features with ease.

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

Try to show the keyboard with some delay е.g. 100-200ms after the dialog create, or just try to request focus for the dialog's EditText using EditText.requestFocus() also with delay after the dialog create.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM