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 altro AlertDialog) 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;
}
È stato utile?

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top