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.
Voici la feuille du bas avec le clavier affiché.
Quelle est la meilleure méthode pour s'assurer que toute la feuille inférieure est affichée?
Merci.
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)
}
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();
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)