Modifica della posizione della finestra di dialogo sullo schermo Android


111

Ho fatto una semplice AlertDialognella mia attività :

View view = layoutInflater.inflate(R.layout.my_dialog, null);
AlertDialog infoDialog = new AlertDialog.Builder(MyActivity.this)
                    .setView(view)  
                    .create();

infoDialog.show();

Con il codice sopra, la finestra di dialogo viene visualizzata al (circa) al centro dello schermo.

Mi chiedo, come posso personalizzare la posizione della finestra di dialogo per visualizzarla appena sotto la barra delle azioni in alto? (C'è comunque per cambiare la gravità o qualcosa del dialogo?) E come farlo in base al mio codice ??


Se ci mostri il tuo layout xml my_dialog, probabilmente possiamo aiutarti ad apportare modifiche.
Alan Moore,


@ Ankit, puoi mettere il tuo commento come risposta, perché il mio problema viene risolto dopo aver controllato il tuo link.
Leem.fin

Risposte:


235

Ho usato questo codice per mostrare la finestra di dialogo nella parte inferiore dello schermo:

Dialog dlg = <code to create custom dialog>;

Window window = dlg.getWindow();
WindowManager.LayoutParams wlp = window.getAttributes();

wlp.gravity = Gravity.BOTTOM;
wlp.flags &= ~WindowManager.LayoutParams.FLAG_DIM_BEHIND;
window.setAttributes(wlp);

Questo codice impedisce anche ad Android di oscurare lo sfondo della finestra di dialogo, se necessario. Dovresti essere in grado di modificare il parametro di gravità per spostare la finestra di dialogo


Ciao, grazie. Ho impostato la sua gravità in alto, la finestra di dialogo va nella parte superiore dello schermo, ma copre anche la mia barra delle azioni, vorrei che la finestra di dialogo fosse in alto ma appena sotto la barra delle azioni ... come regolarla?
Leem.fin

6
Potresti provare a utilizzare i campi wlp.xe wlp.yper impostare esplicitamente la posizione della finestra di dialogo sullo schermo. Non l'ho provato da solo, ma probabilmente dovrebbe funzionare.
Aleks G,

4
La cancellazione dell'oscuramento non ha funzionato per me (anche se il resto ha funzionato a meraviglia). Ho trovato una soluzione all'oscuramento in un altro punto, sotto forma di: window.clearFlags (WindowManager.LayoutParams.FLAG_DIM_BEHIND);
Rubberduck

@ AleksG c'è un modo per cambiare anche il colore dello sfondo scuro mantenendo il dailog al centro? Ho provato a impostare windowIsFloating = false in stile dailog. Ma allinea dailog in alto!
Kshitij

@Kshitij Se vuoi mantenere il dialogo al centro, non hai bisogno di nessuno di questo codice: Android centra i dialoghi per impostazione predefinita. Per quanto riguarda la modifica del colore scuro, questo è controllato dal tema. Potresti essere in grado di sovrascriverlo includendo il tema corrispondente nella tua app. Non l'ho mai provato però.
Aleks G

23
private void showPictureialog() {
    final Dialog dialog = new Dialog(this,
            android.R.style.Theme_Translucent_NoTitleBar);

    // Setting dialogview
    Window window = dialog.getWindow();
    window.setGravity(Gravity.CENTER);

    window.setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
    dialog.setTitle(null);
    dialog.setContentView(R.layout.selectpic_dialog);
    dialog.setCancelable(true);

    dialog.show();
}

è possibile personalizzare la finestra di dialogo in base alla gravità e i parametri di layout cambiano la gravità e i parametri di layout in base alle proprie esigenze


1
Ciao, grazie. Ho impostato la sua gravità in alto, la finestra di dialogo va nella parte superiore dello schermo, ma copre anche la mia barra delle azioni, vorrei che la finestra di dialogo fosse in alto ma appena sotto la barra delle azioni ... come regolarla?
Leem.fin

3
puoi impostare il margine superiore del layout
Ramesh Solanki

'FILL_PARENT'è deprecato. Sono su API 21. Come da riferimento
fWd82

1
@ fWd82 quindi usa "MATCH_PARENT" invece
William

13

Ho trovato questo frammento di codice dal codice @gypsicoder qui

private CharSequence[] items = {"Set as Ringtone", "Set as Alarm"};
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setItems(items, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int item) {

        if(item == 0) {

        } else if(item == 1) {

        } else if(item == 2) {

        }
    }
});

AlertDialog dialog = builder.create();
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
WindowManager.LayoutParams wmlp = dialog.getWindow().getAttributes();

wmlp.gravity = Gravity.TOP | Gravity.LEFT;
wmlp.x = 100;   //x position
wmlp.y = 100;   //y position

dialog.show();

Qui il valore della posizione x è pixel da sinistra a destra. Per la posizione y il valore va dal basso verso l'alto.


10

Per me, questo ha funzionato abbastanza bene quando stavo cercando di posizionare la mia finestra di dialogo da qualche parte esattamente nella parte inferiore della visualizzazione di testo dove viene selezionata.

public void setPosition(int yValue) {
    Window window = getWindow();
    WindowManager.LayoutParams param = window.getAttributes();
    param.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL;
    param.y = yValue;
    window.setAttributes(param);
    window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
}

10

Nuovo BottomSheetDialog:

BottomSheetDialog dialog = new BottomSheetDialog(YourActivity.this);    
dialog.setContentView(YourView);

dialog.show();

5

aggiungilo al tuo codice:

dialog.getWindow().setGravity(Gravity.BOTTOM);


1

Per la mia attività di dialogo ho usato questo:

WindowManager.LayoutParams lp = this.getWindow().getAttributes();
lp.gravity = Gravity.BOTTOM;

1

io uso questo metodo

 @Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    final Dialog dialog = new Dialog(getActivity());
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
    Window window = dialog.getWindow();
    WindowManager.LayoutParams wlp = window.getAttributes();
    wlp.gravity = Gravity.BOTTOM;
    dialog.setContentView(R.layout.dialog_droppoint);
    dialog.show();
    window.setAttributes(wlp);
    return dialog;

}

0

usa bottomSHeet:

BottomSheetDialog dialog = new BottomSheetDialog(YourActivity.this);
dialog.setContentView(YourView);
dialog.show();

0
public class MyDialogFragment extends DialogFragment{
    protected void setDialogGravity(int gravity) {
        Dialog dialog = getDialog();
        if (dialog != null) {
            Window window = dialog.getWindow();
            if (window != null) {
                WindowManager.LayoutParams params = window.getAttributes();
                params.width = WindowManager.LayoutParams.MATCH_PARENT;
                params.height = WindowManager.LayoutParams.MATCH_PARENT;
                params.horizontalMargin = 0;
                params.gravity = gravity;
                params.dimAmount = 0;
                params.flags &= ~WindowManager.LayoutParams.FLAG_DIM_BEHIND;
                window.setAttributes(params);
            }
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater,container,savedInstanceState);

        return inflater.inflate(R.layout.my_dialog, null);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
                super.onViewCreated(view, savedInstanceState);
                setDialogGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL);
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.