更改AlertDialog按钮对齐

时间:2015-11-10 00:19:17

标签: java android alertdialog android-appcompat

为了改变AlertDialog(support.v7 one)中按钮的对齐而花了好几个小时,因为它们不会根据区域设置视图方向对齐自己,尽管整个应用程序都对齐左边,也是AlertDialog中的文字。

(为什么会发生这种情况?我正在以编程方式将语言环境语言配置为“en”,因为这是我的默认应用语言,即使系统区域设置可能是其他内容)。

就像我说的那样,我不需要触摸对话框内的消息,但作为一个例子,那就是如何改变它的方向:

TextView messageView = (TextView)dialog.findViewById(android.R.id.message);
messageView.setGravity(Gravity.RIGHT); // or LEFT

当然它不适用于按钮,因为我需要改变布局重力。

这是我如何找到按钮(当我在AlertDialog.Builder上调用show()之后,当然,否则它们将为null):

AppCompatButton accept = (AppCompatButton)dialog.findViewById(android.R.id.button1);
AppCompatButton cancel = (AppCompatButton)dialog.findViewById(android.R.id.button2);

以下是我尝试在父级LinearLayout中更改对齐的方法:

((LinearLayout.LayoutParams)accept.getLayoutParams).gravity = Gravity.RIGHT;
((LinearLayout.LayoutParams)cancel.getLayoutParams).gravity = Gravity.RIGHT;

我选择了RIGHT,因为对话框内按钮的一侧始终与文本对齐的一侧相反。(是的 - 我也尝试了LEFT,没有任何改变)。

这不起作用。有谁知道如何实现这一目标?看起来他们只是坚持自己的位置。

编辑: 标题也没有对齐,我刚刚确认了这一点(出于某种原因,它出现在右侧,就像我的系统配置一样,而不像我的语言环境配置)。

2 个答案:

答案 0 :(得分:3)

问题不在于Gravity设置......当您查看xml源代码(../sdk/platforms/android-23/data/res/layout/alert_dialog_material.xml)时,布局AlertDialog包含以下内容:< / p>

<LinearLayout android:id="@+id/buttonPanel"
    style="?attr/buttonBarStyle"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" ...>

    <Button android:id="@+id/button3"
        style="?attr/buttonBarNeutralButtonStyle" ... />

    <Space
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:visibility="invisible" />

    <Button android:id="@+id/button2"
        style="?attr/buttonBarNegativeButtonStyle" ... />

    <Button android:id="@+id/button1"
        style="?attr/buttonBarPositiveButtonStyle" ... />
</LinearLayout>

按钮有一个Space视图。该视图以其重量填充容器。因此,您实际上有一个小部件可以按下右侧容器中的按钮。

一个简单的解决方案可能是在设置重力之前获取父按钮容器并删除Space元素。

// get the container
LinearLayout containerButtons = (LinearLayout) dialog.findViewById(R.id.buttonPanel); 
// remove the Space view
containerButtons.removeView(containerButtons.getChildAt(1)); 
// set a gravity to the children buttons
containerButtons.setGravity(Gravity.RIGHT); 

但是,您应该创建并使用自己的自定义布局,以防将来可能发生Google的开发更改。

答案 1 :(得分:1)

您可以完全自定义AlertDialog。 这里的技巧可能是使用对话框的自定义视图,并在该视图中创建自己的按钮。

例如,请参阅 How can can I add custom buttons into an AlertDialog's layout?