web-dev-qa-db-fra.com

Afficher la feuille de fond avec EditText au-dessus du clavier

J'implémente une interface utilisateur où une feuille de fond apparaîtra au-dessus du clavier avec un EditText pour que l'utilisateur entre une valeur. Le problème est que la vue recouvre partiellement le clavier et recouvre le bas de la feuille inférieure.

Voici la feuille inférieure et pas de clavier.

 Bottom Sheet

Voici la feuille du bas avec le clavier affiché.

 enter image description here

Quelle est la meilleure méthode pour s'assurer que toute la feuille inférieure est affichée?

Merci.

4
Advice-Dog

Pour cela, j’ai trouvé qu’une AlertDialog fonctionnait mieux. Bien qu'il ne soit pas aligné contre le bas ou le côté de l'écran, il a tout de même l'air suffisant.

Tout d’abord, créez la AlertDialog avec votre vue.

val view = LayoutInflater.from(context).inflate(R.layout.alert, null)

dialog = AlertDialog.Builder(context)
             .setView(view)
             .create()

Ensuite, définissez la gravité.

    dialog.window.attributes.gravity = Gravity.BOTTOM

Et enfin, montrez-le.

dialog.show()

Vous pouvez également lier le clavier pour rester avec la boîte de dialogue, en utilisant un onDismissListener.

Après avoir montré la AlertDialog, je force le clavier.

Appelez cette méthode en passant votre EditText.

fun showKeyboard(view: View?) {
        if (view == null) return;

        val imm = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
    }

Et pour avoir licencié dans la onDismissListener.

private fun hideKeyboard() {
        val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0)
    }
1
Advice-Dog

Une BottomSheetDialog peut être utile pour cela. il s’ouvrira avec le clavier virtuel ouvert en mettant l’accent sur le texte modifié. Cependant, l’utilisateur peut toujours fermer le clavier virtuel et la boîte de dialogue sera réinitialisée sur Bas. De nouveau, la mise au point fera apparaître le dialogue en haut du clavier logiciel. 

 public void showDialog()  {
    final BottomSheetDialog dialog=new BottomSheetDialog(this);
    dialog.setContentView(R.layout.item_dialog);
    dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    dialog.show();
}

Vous pouvez faire développer BottomSheetDialog sur le clavier. Mais pour cela, vous devez l'appeler après SoftKeyboard Open. le code Expand est.

 BottomSheetDialog d = (BottomSheetDialog) dialog;
            FrameLayout bottomSheet = (FrameLayout) d.findViewById(Android.support.design.R.id.design_bottom_sheet);
            BottomSheetBehavior.from(bottomSheet).setState(BottomSheetBehavior.STATE_EXPANDED);

Je l'ai testé sur DialogInterface.OnShowListener() mais cela ne fonctionne pas. Testé avec elle 1 seconde de retarder son fonctionnement. Mais le retard n'est pas la solution. Vous devez déterminer l'action pour laquelle vous devez développer la boîte de dialogue.

 final BottomSheetDialog dialog=new BottomSheetDialog(this);
    dialog.setContentView(R.layout.item_dialog);
    dialog.getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE|
                    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            FrameLayout bottomSheet = (FrameLayout) dialog.findViewById(Android.support.design.R.id.design_bottom_sheet);
            BottomSheetBehavior.from(bottomSheet).setState(BottomSheetBehavior.STATE_EXPANDED);
        }
    },2000);
    dialog.show();
2
ADM
dialog = new BottomSheetDialog(getContext(), R.style.BottomSheetDialog);  
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    BottomSheetDialog d = (BottomSheetDialog) dialog;
                    FrameLayout bottomSheet = d.findViewById(R.id.design_bottom_sheet);
                    BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet);
                    bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
                }
            },0);
        }
    });

Ce code fonctionne bien avec la méthode onCreateView de Fragment (merci à ADM)

2
Nordknight