Cambio de posición del diálogo en la pantalla de Android

111

Hice un simple AlertDialogen mi Actividad :

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

infoDialog.show();

Con el código anterior, el cuadro de diálogo se muestra en (aproximadamente) el centro de la pantalla.

Me pregunto, ¿cómo puedo personalizar la posición del diálogo para que se muestre justo debajo de la barra de acción superior? (¿Hay alguna forma de cambiar la gravedad o algo del diálogo?) ¿Y cómo hacerlo en función de mi código?

Leem.fin
fuente
Si nos muestra su diseño xml my_dialog, probablemente podamos ayudarlo a realizar cambios.
Alan Moore
¿duplicar? stackoverflow.com/questions/5469005/…
Samir Mangroliya
@ Ankit, ¿puede poner su comentario como respuesta, porque mi problema se resuelve después de verificar su enlace?
Leem.fin

Respuestas:

235

Usé este código para mostrar el diálogo en la parte inferior de la pantalla:

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);

Este código también evita que Android atenúe el fondo del cuadro de diálogo, si lo necesita. Debería poder cambiar el parámetro de gravedad para mover el cuadro de diálogo

Aleks G
fuente
Hola gracias. Configuré su gravedad en la parte superior, el diálogo va en la parte superior de la pantalla, pero también cubrió mi barra de acción, me gustaría el diálogo en la parte superior, pero justo debajo de la barra de acción ... ¿cómo ajustar esto?
Leem.fin
6
Puede intentar usar los campos wlp.xy wlp.ypara establecer explícitamente la ubicación del cuadro de diálogo en la pantalla. No lo he probado yo mismo, pero probablemente debería funcionar.
Aleks G
4
La eliminación de la atenuación no funcionó para mí (aunque el resto funcionó de maravilla). Encontré una solución para la atenuación en otro lugar, en forma de: window.clearFlags (WindowManager.LayoutParams.FLAG_DIM_BEHIND);
Rubberduck
@AleksG, ¿hay alguna manera de cambiar también el color del fondo tenue manteniendo el dailog en el centro? Intenté configurar windowIsFloating = false al estilo dailog. ¡Pero alinea el dailog hacia arriba!
Kshitij
@Kshitij Si desea mantener el diálogo en el centro, no necesita nada de este código: Android centra los diálogos de forma predeterminada. En cuanto a cambiar el color tenue, esto está controlado por el tema. Es posible que pueda anularlo al incluir el tema correspondiente en su aplicación. Aunque nunca lo probé.
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();
}

puede personalizar su cuadro de diálogo en función de la gravedad y los parámetros de diseño cambiar la gravedad y los parámetros de diseño en función de sus requisitos

Ramesh Solanki
fuente
1
Hola gracias. Configuré su gravedad en la parte superior, el diálogo va en la parte superior de la pantalla, pero también cubrió mi barra de acción, me gustaría el diálogo en la parte superior, pero justo debajo de la barra de acción ... ¿cómo ajustar esto?
Leem.fin
3
puede establecer el margen superior del diseño
Ramesh Solanki
'FILL_PARENT'es obsoleto. Estoy en API 21. Según Developer Reference
fWd82
1
@ fWd82 así que use 'MATCH_PARENT' en su lugar
William
13

Encontré este fragmento de código del código @gypsicoder aquí

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();

Aquí el valor de la posición x son píxeles de izquierda a derecha. Para la posición y, el valor es de abajo hacia arriba.

Md. Sajedul Karim
fuente
10

Para mí, esto funcionó bastante bien cuando estaba tratando de colocar mi diálogo en algún lugar exactamente en la parte inferior de la vista de texto donde se selecciona.

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);
}
Wahib Ul Haq
fuente
9

Nuevo BottomSheetDialog:

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

dialog.show();
mohamed murashid
fuente
5

solo agrega esto a tu código:

dialog.getWindow().setGravity(Gravity.BOTTOM);
Techashonline
fuente
1
dialog.getWindow().getAttributes().gravity = Gravity.BOTTOM;
Hossein Mansouri
fuente
1

Para mi actividad de Diálogo utilicé este:

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

yo uso este método

 @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;

}
Mue
fuente
0

utilizar bottomSHeet:

BottomSheetDialog dialog = new BottomSheetDialog(YourActivity.this);
dialog.setContentView(YourView);
dialog.show();
abbasalim
fuente
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);
    }
}
NickUnuchek
fuente