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 ??

Leem.fin
fonte
Se você nos mostrar seu layout xml my_dialog, provavelmente poderemos ajudá-lo a fazer alterações.
Alan Moore
duplicado? stackoverflow.com/questions/5469005/…
Samir Mangroliya
@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

Aleks G
fonte
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

Ramesh Solanki
fonte
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.

Md. Sajedul Karim
fonte
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);
}
Wahib Ul Haq
fonte
10

Novo BottomSheetDialog:

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

dialog.show();
Mohamed Murashid
fonte
5

basta adicionar ao seu código:

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

Para minha atividade do Dialog, usei este:

WindowManager.LayoutParams lp = this.getWindow().getAttributes();
lp.gravity = Gravity.BOTTOM;
Andris
fonte
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;

}
Mue
fonte
0

use bottomSHeet:

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