AlertDialog mostra la vista delle dimensioni di un paesaggio con orientamento nel paesaggio
-
12-11-2019 - |
Domanda
L'attività principale della mia app è ambientata nel manifest per essere sempre nella vista del ritratto. Funziona bene quando carico l'app sul tablet.
Tuttavia, quando utilizzo il pulsante del mio menu e faccio clic su "Imposta", che apre un AlertDialog
Ciò gonfia un layout XML, il tablet visualizzerà il 2/3 di sinistra dell'intero dialogo. Il resto va fuori dallo schermo a destra. Questo caso si verifica solo se installo la mia app sul tablet mentre lo tengo in modalità orologio o se trasformo il tablet in modalità orizzontale mentre l'app non è in esecuzione (anche se torno al ritratto e faccio clic sull'app). Il dialogo chiama anche this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
Per assicurarsi che rimanga nel ritratto (anche se il problema persiste con questa chiamata o meno).
In altre parole, il modo in cui il AlertDialog
viene visualizzato nella vista del ritratto è che sta esplodendo una vista paesaggistica (e quindi parte di esso va fuori dallo schermo), anche se l'orientamento effettivo del AlertDialog
è ritratto, come dovrebbe essere.
(Mi scuso se la formulazione sopra era confusa: chiedimi di chiarire qualsiasi cosa se necessario.)
Allora perché il tablet dovrebbe farlo? L'ho testato su alcuni telefoni cellulari Android e questo non accade, quindi non capisco perché il tablet lo farà.
Note secondarie:
Questo non sta nemmeno accadendo solo per questo
AlertDialog
O .. il mio eula che viene visualizzato all'inizio dell'app (un altroAlertDialog
) appare anche in questo modo se inizio l'app in modalità paesaggio.Ho anche permesso l'usabilità del paesaggio eliminando tutte le chiamate per specificare la modalità ritratto/paesaggio e il tablet sta ancora spendendo la finestra di dialogo fuori dallo schermo quando tenuto in vista sul ritratto solo sul tablet, ma non sui telefoni.
MODIFICARE:
Questo codice funziona bene al telefono, ma il problema del tablet persiste ancora. Se sono un disassetto dialog.show();
Di seguito, il tablet e il telefono visualizzano le dimensioni che desidero, ma sull'oscurità invece della schermata principale dimmessa. Qualche idea?
La funzione di chiamata fa questo:
showDialog(EXAMPLE_CASE);
Funzione che viene chiamata dalla funzione chiamante:
protected Dialog onCreateDialog(final int id) {
Dialog dialog;
AlertDialog.Builder builder = new AlertDialog.Builder(this);
Display display = getWindowManager().getDefaultDisplay();
int mwidth = display.getWidth();
int mheight = display.getHeight();
WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
switch(id) {
// Example of what all my cases look like (there were way too many to copy)
case EXAMPLE_CASE:
builder.setTitle("Example")
.setMessage("Example message")
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialoginterface,int i) {
dialoginterface.dismiss();
showDialog(DIALOG_CHOICE);
}
})
.setCancelable(false);
dialog = builder.create();
break;
}
if (dialog != null) {
lp.copyFrom(dialog.getWindow().getAttributes());
lp.width = mwidth;
lp.height = mheight;
lp.x = mwidth;
//lp.y = mheight;
lp.dimAmount=0.0f;
//dialog.show();
dialog.getWindow().setAttributes(lp);
dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
dialog.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
removeDialog(id);
}
});
}
return dialog;
}
Soluzione
Potresti provare a ottenere le dimensioni dello schermo come questa:
Display display = getWindowManager().getDefaultDisplay();
int mwidth = display.getWidth();
int mheight = display.getHeight();
E poi modificare il Dialog
come questo:
AlertDialog.Builder adb = new AlertDialog.Builder(this);
Dialog d = adb.setView(new View(this)).create();
// (That new View is just there to have something inside the dialog that can grow big enough to cover the whole screen.)
d.show();
WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
lp.copyFrom(d.getWindow().getAttributes());
lp.width = mwidth;
lp.height = myheight;
//change position of window on screen
lp.x = mwidth/2; //set these values to what work for you; probably like I have here at
lp.y = mheight/2; //half the screen width and height so it is in center
//set the dim level of the background
lp.dimAmount=0.1f; //change this value for more or less dimming
d.getWindow().setAttributes(lp);
//add a blur/dim flags
d.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND | WindowManager.LayoutParams.FLAG_DIM_BEHIND);
Inoltre, dici che stai gonfiando un layout personalizzato. Hai provato a armeggiare con il layout_height
e layout_width
delle opinioni in quel layout per vedere se questo fa la differenza?