Search code examples
androidandroid-alertdialogandroid-softkeyboard

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

enter image description here

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

enter image description here

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


Solution

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