【问题标题】:Android AlertDialog align buttons to bottom not workingAndroid AlertDialog 将按钮对齐到底部不起作用
【发布时间】:2021-12-02 00:50:40
【问题描述】:

我有一个 Android AlertDialog 有一些信息和中性和积极按钮。

我用下面这行设置了AlertDialog 的大小,这给了它我想要的正确高度:

MaterialAlertDialogBuilder alert = new MaterialAlertDialogBuilder(context);
alert.setView(wifiResultView);
// stuff
alertDialog = alert.show();
alertDialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

但是,这些按钮与对话框中数据的末尾对齐,我一生都无法弄清楚如何让它们粘在底部。有人知道吗?我将不胜感激。

我希望按钮贴在窗口底部,在数据和按钮之间留有空间(而不是像图片中那样在按钮下方留有空间)。

我使用的是 Android 11(三星 Galaxy S10e)

非常感谢!

【问题讨论】:

    标签: java android android-alertdialog


    【解决方案1】:

    这是AlertDialog 的默认行为。要将按钮与底部对齐,您还必须将警报容器 AlertDialogLayout 的高度更改为 MATCH_PARENT。不幸的是,目前没有公共 API 可以从 AlertDialog 检索 AlertDialogLayout,所以下面我将描述两种可能的解决方案来从 AlertDialog 检索它并更改其高度。

    1.直接从PositiveButton中找到AlertDialogLayout:

    Button btn = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
    AlertDialogLayout alertDialogLayout = (AlertDialogLayout) btn.getParent().getParent().getParent();
    alertDialogLayout.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));
    

    2.从PositiveButton根视图开始循环查找AlertDialogLayout:

    Button btn = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
    View rootView = btn.getRootView();
    findAlertDialogLayoutAndSetParams(rootView);
    

    findAlertDialogLayoutAndSetParams(View view) 是一个辅助函数,它会重复出现,直到找到 AlertDialogLayout:

    private void findAlertDialogLayoutAndSetParams(View view){
    
        if(view instanceof ViewGroup) {
            ViewGroup viewGroup = (ViewGroup)view;
            for(int i = 0; i < viewGroup.getChildCount(); i++) {
                View childView = viewGroup.getChildAt(i);
                if(childView instanceof ViewGroup) {
                    if(childView instanceof AlertDialogLayout){
                        AlertDialogLayout alertDialogLayout = (AlertDialogLayout)childView;
                        alertDialogLayout.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));
                    }
                    else {
                        findAlertDialogLayoutAndSetParams(childView);
                    }
                }
            }
        }
    }
    

    完整示例:

    //get your custom view
    LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View wifiResultView = mInflater.inflate(R.layout.alert_view_layout, null, false);
    
    //create the MaterialAlertDialogBuilder
    MaterialAlertDialogBuilder alert = new MaterialAlertDialogBuilder(context);
    alert.setPositiveButton("Ok", null);
    alert.setNeutralButton("Cancel", null);
    alert.setView(wifiResultView);
    AlertDialog alertDialog = alert.show();
    alertDialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
    
    //stick the buttons to the bottom by setting the height of AlertDialogLayout to MATCH_PARENT
    //1st option - get the AlertDialogLayout directly from the positive button
    Button btn = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
    AlertDialogLayout alertDialogLayout = (AlertDialogLayout) btn.getParent().getParent().getParent();
    alertDialogLayout.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));
    
    //2nd option - find AlertDialogLayout in a recurring way starting from the positive button root view
    //Button btn = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
    //View rootView = btn.getRootView();
    //findAlertDialogLayoutAndSetParams(rootView);
    

    之前/之后的结果:

    【讨论】:

      【解决方案2】:

      我正在使用此代码,它工作正常:

      AlertDialog.Builder builder = new AlertDialog.Builder(this);
          builder.setTitle("test title");
          builder.setCancelable(false);
          builder.setPositiveButton("unfreeze", (dialog, which) -> {
              // do some things
          });
          builder.setNeutralButton("ok", (dialog, which) -> {
              // do some things
          });
          AlertDialog alertDialog = builder.create();
          alertDialog.getWindow()
                  .setLayout(ViewGroup.LayoutParams.MATCH_PARENT,
                          ViewGroup.LayoutParams.MATCH_PARENT);
      
          alertDialog.show();
      

      能否请您分享您的AlertDialog代码和您的设备Android版本的更多详细信息,也尝试在其他手机中进行测试。

      编辑

      您可以将Space 放在wifiResultView 的末尾:

      <Space
              android:layout_width="match_parent"
              android:layout_height="200dp" />
      
      

      LayoutParams.MATCH_PARENT 更改为LayoutParams.WRAP_CONTENT

      您的代码将是这样的:

      alertDialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT,
       ViewGroup.LayoutParams.WRAP_CONTENT);
      
      

      【讨论】:

      • 我已编辑帖子以包含您要求的信息。顺便说一句,当我像您在示例中那样构建对话框时,对话框的高度不像我想要的那样,而是高度包裹了内容。
      • 为什么你不把你的Buttons放在wifiResultView 里面
      • 我试过了,但它也没有将按钮放在底部,而是将它们放在对话框按钮所在的上方。
      • 查看我的答案编辑我希望有效
      猜你喜欢
      • 1970-01-01
      • 2015-08-24
      • 1970-01-01
      • 1970-01-01
      • 2011-06-08
      • 1970-01-01
      • 2021-05-01
      • 2017-01-29
      • 2015-10-25
      相关资源
      最近更新 更多