Mostrar AlertDialog em qualquer posição da tela

106

Quando mostramos um AlertDialog no Android, ele é exibido no centro da tela. Existe alguma maneira de mudar a posição?

cigano
fonte

Respostas:

255

Após pesquisar em vários post encontrei a solução.

O código está postado abaixo:

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

Aqui, o valor da posição x é pixels da esquerda para a direita. Para a posição y, o valor é de baixo para cima.

cigano
fonte
1
Você também pode criar um diálogo de alerta personalizado. Eu fiz isso recentemente e tive que obter a largura e a altura dos monitores e definir o X e o Y com base em uma porcentagem desses valores, para que o layout fosse bem dimensionado. developer.android.com/guide/topics/ui/dialogs.html#CustomDialog
Roloc
15
Funciona, mas eu tive que adicionar: WMLP.gravity = Gravity.TOP | Gravity.LEFT; caso contrário, os valores xey foram usados ​​como deslocamentos do centro da tela.
BoD de
1
Só para compartilhar a experiência: o código acima funciona apenas enquanto a caixa de diálogo puder ficar completamente na tela. Por exemplo, se a nova coordenada y for muito grande, o diálogo é movido para a posição mais baixa na tela que ainda mostra todo o diálogo. A parte complicada aqui é que os valores xey dos parâmetros de layout mostram a partir de então não mais as coordenadas do canto superior esquerdo da janela de diálogo e não podem mais ser usados ​​para calcular um movimento relativo da janela, por exemplo quando reagindo a um MotionEvent.
Nantoka
1
funciona como um encanto ... mas não há necessidade de definir, wmlp.x = 100; //x position wmlp.y = 100;você apenas definir a gravidade wmlp.gravity = Gravity.TOP | Gravity.LEFT;é o suficiente
Ajay Mistry
14

Se você, por exemplo, quiser mover o diálogo de progresso um pouco mais para baixo e não definir a posição do pixel exakt, isso é suficiente:

progressDialog.getWindow().getAttributes().verticalMargin = 0.2F;
pgsandstrom
fonte
Quero dar cerca de 10 dp de margem ao diálogo de alerta cuja gravidade é o centro. Posso usar o código acima? Se não, existe alguma outra maneira de fazer isso?
Aman Verma
5

Para tornar a configuração um efeito de informação, adicionei o seguinte código
dialog.getWindow().setAttributes(wmlp);

depois de alterar o valor de wmlp na resposta do gypsicoder, ou a configuração de wmlp não tem efeito no meu teste.

Juejiang
fonte
0

Essas respostas moverão a posição do AlertDialog, no entanto, a posição da caixa de diálogo exibida também incluirá o preenchimento ao redor da caixa de diálogo.

Se você quiser se livrar deste preenchimento (por exemplo, para colocar sua caixa de diálogo alinhada com a parte inferior da tela), você também precisará substituir o estilo AlertDialog padrão em seu styles.xml para definir o windowBackground como nulo, assim :

<resources>
    <!--  Example app theme - mine uses the below -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:alertDialogTheme">@style/MyDialogTheme</item>
    </style>

    <style name="MyDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert">
    <!-- Full width -->
        <item name="android:layout_width">fill_parent</item>

    <!-- Null window background kills surrounding padding -->
        <item name="android:windowBackground">@null</item>
        <item name="android:windowNoTitle">true</item>

     </style>
</resources> 

Além de definir Window.LayoutParameters conforme descrito na resposta aceita.

Mensagem especial para @David Caunt cuja resposta em: remove border, padding from Dialog completou esta imagem.

HappyKatz
fonte