Alterar a posição do diálogo na tela do Android


111

Fiz um simples AlertDialogem minha atividade :

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

infoDialog.show();

Com o código acima, a caixa de diálogo é exibida no (cerca) centro da tela.

Estou me perguntando, como posso personalizar a posição da caixa de diálogo para torná-la exibida logo abaixo da barra de ação superior? (Existe alguma maneira de mudar a gravidade ou algo do diálogo?) E como fazer isso baseado no meu código ??


Se você nos mostrar seu layout xml my_dialog, provavelmente poderemos ajudá-lo a fazer alterações.
Alan Moore


@Ankit, pode colocar seu comentário como resposta, pois meu problema fica resolvido após verificar seu link.
Leem.fin

Respostas:


235

Usei este código para mostrar a caixa de diálogo na parte inferior da tela:

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

Esse código também evita que o Android esmaeça o plano de fundo da caixa de diálogo, se necessário. Você deve ser capaz de alterar o parâmetro de gravidade para mover o diálogo sobre


Oi obrigado. Eu defini sua gravidade para o topo, a caixa de diálogo vai para o topo da tela, mas também cobriu minha barra de ação, gostaria que a caixa de diálogo estivesse no topo, mas logo abaixo da barra de ação ... como ajustar isso?
Leem.fin

6
Você pode tentar usar os campos wlp.xe wlp.ypara definir explicitamente a localização da caixa de diálogo na tela. Eu não tentei sozinho, mas provavelmente deve funcionar.
Aleks G

4
A limpeza do escurecimento não funcionou para mim (embora o resto funcionou como um encanto). Eu encontrei uma solução para o escurecimento em outro ponto, na forma de: window.clearFlags (WindowManager.LayoutParams.FLAG_DIM_BEHIND);
Rubberduck de

@AleksG existe uma maneira de também mudar a cor do fundo escuro mantendo o dailog no centro? Tentei definir windowIsFloating = false para o estilo dailog. Mas alinha dailog ao topo!
Kshitij

@Kshitij Se você deseja manter o diálogo no centro, você não precisa de nenhum desses códigos - o Android centra os diálogos por padrão. Quanto à mudança da cor escura, isso é controlado pelo tema. Você pode substituí-lo incluindo o tema correspondente em seu aplicativo. Mas nunca tentei.
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();
}

você pode personalizar seu diálogo com base na gravidade e os parâmetros de layout alteram a gravidade e o parâmetro de layout com base em suas necessidades


1
Oi obrigado. Eu defini sua gravidade para cima, a caixa de diálogo vai para o topo da tela, mas também cobriu minha barra de ação, eu gostaria que a caixa de diálogo estivesse no topo, mas logo abaixo da barra de ação ... como ajustar isso?
Leem.fin

3
você pode definir a margem superior do layout
Ramesh Solanki

'FILL_PARENT'está obsoleto. Estou na API 21. Conforme Referência do Desenvolvedor
fWd82

1
@ fWd82 então use 'MATCH_PARENT' em vez
William

13

Encontrei este snippet de código do código @gypsicoder aqui

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.


10

Para mim, isso funcionou muito bem onde eu estava tentando posicionar meu diálogo em algum lugar exatamente na parte inferior da visualização de texto onde ele é selecionado.

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

Novo BottomSheetDialog:

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

dialog.show();

5

basta adicionar ao seu código:

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


1

Para minha atividade do Dialog, usei este:

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

1

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

}

0

use 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);
    }
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.