2015-11-10 78 views
1

为改变AlertDialog(support.v7之一)中的按钮对齐方式而奋斗了数小时,因为它们不会根据区域设置视图方向对齐自己,尽管整个应用程序仍然对齐到左侧以及AlertDialog中的文本。 (为什么会发生这种情况,你说?我编程地配置语言环境语言为“en”,因为这是我的默认应用程序语言,即使系统语言环境可能是其他语言)。更改AlertDialog按钮的对齐方式

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

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

当然它不工作按钮,因为我需要改变布局的重力。

以下是我找到的按钮(后我呼吁当然AlertDialog.Builder秀(),否则会是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总是相反,其中的文本对齐到一边。(是的 - 我也尝试过,没有改变)。

这不起作用。有没有人有一个想法如何实现这一目标?看起来他们只是坚持住自己的位置。

编辑: 标题也没有对齐,我刚刚证实了这一点(出于某种原因,它出现在右边,像我的系统配置,而不是像我的区域设置配置)。

回答

1

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

举一个例子,看 How can can I add custom buttons into an AlertDialog's layout?

+0

但我想的观点看本地,而不是定制的。我不明白为什么我需要创建一个整体,只是为了对齐按钮...但是如果您认为这是唯一的方法,那么我会采用AlertDialog的原始布局并稍微改变它。你知道在哪里可以找到它吗? – Jjang

+0

还有一件事要尝试...如果您在显示对话框之前正在设置按钮的layoutParams的重力,请尝试在dialog.show()之后执行操作。 – GreyBeardedGeek

+0

我正在做它之后,当然:(哇,那些按钮不会移动吧? – Jjang

3

的问题是不是Gravity设置...当你看到XML源(../sdk/platforms/android-23/data/res/layout/alert_dialog_material.xml),布局的AlertDialog包含此:

<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的开发更改。

+0

这不是一个完美的解决方案,因为谷歌可能会更新此布局并更改'空间'子视图,这将给出某些'NullPointerException'。目前,这个视图没有'Id',所以我不能确定这个布局的未来变化。 – blueware