alertdialog button位置潜谈

创建一个alertdialog,在setNegativeButton和setPositiveButton之后,

创建出来的dialog的“确定”“取消”,左边是“取消”,右边是“确定”。

如下图(android用电脑截图命令:adb shell screencap -p /sdcard/1.png 然后adb pull /sdcard/1.png将图片拉到电脑上)



不对其合理性及易用性进行分析。只对代码进行分析,android中是如何将setNegativeButton和setPositiveButton两个函数摄入的字符添加到button中,并且如何布局两个button的位置进行阐述。两个方法是一毛一样的,只描述其中一个即可了。

1.Alertdialog

public Builder setPositiveButton(CharSequence text, final OnClickListener listener) {
            P.mPositiveButtonText = text;
            P.mPositiveButtonListener = listener;
            return this;
        }
这里的p是关键,参数都给它了。看下定义

public static class Builder {
        private final AlertController.AlertParams P;
是alertcontroller的参数

2.进入AlertController.java

    private Button mButtonPositive;
    private CharSequence mButtonPositiveText;
这里看到了button和text。

不用多看,text肯定是给了mButtonPositiveText了。

来看看button是如何布局位置的。

    private void setupButtons(ViewGroup buttonPanel) {
...
        mButtonPositive = (Button) buttonPanel.findViewById(R.id.button1);
...
这里就是button的布局加载了。

3.找到xml中button的布局看一下

<LinearLayout android:id="@+id/buttonPanel"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:minHeight="@dimen/alert_dialog_button_bar_height"
        android:orientation="vertical"

        android:divider="?android:attr/dialogButtonBarDivider"
        android:showDividers="beginning"
        android:dividerPadding="0dip">
        <LinearLayout
            style="?android:attr/dialogButtonBarStyle"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:layoutDirection="locale"
            android:measureWithLargestChild="true">
            <Button android:id="@+id/button2"
                android:layout_width="wrap_content"
                android:layout_gravity="start"
                android:layout_weight="1"
                android:maxLines="2"
                style="?android:attr/dialogButtonBarButtonStyle"
                android:textSize="25dp"
                android:minHeight="@dimen/alert_dialog_button_bar_height"
                android:layout_height="wrap_content" />
            <Button android:id="@+id/button3"
                android:layout_width="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_weight="1"
                android:maxLines="2"
                style="?android:attr/dialogButtonBarButtonStyle"
                android:textSize="25dp"
                android:minHeight="@dimen/alert_dialog_button_bar_height"
                android:layout_height="wrap_content" />
            <Button android:id="@+id/button1"
                android:layout_width="wrap_content"
                android:layout_gravity="end"
                android:layout_weight="1"
                android:maxLines="2"
                android:minHeight="@dimen/alert_dialog_button_bar_height"
                style="?android:attr/dialogButtonBarButtonStyle"
                android:textSize="25dp"
                android:layout_height="wrap_content" />
        </LinearLayout>
     </LinearLayout>

看到button1的属性: android:layout_gravity="end",这就是为什么“确定”在右边的原因了。


4.PS题外话

据说是android看苹果这么设计,也这么搞的。。

找到google的11年的提交,可能是android3.0/4.0版本上开始做的修改。可以看到button1和button2换了位置。也就是“确定”和“取消”左右换了位置。

uthor: Adam Powell <adamp@google.com>  2011-06-15 04:37:14
Committer: Adam Powell <adamp@google.com>  2011-06-17 09:20:54
Parent: bd964f96245227d994f0b1dc019c29c661836638 (Tweak padding and sizing of alert dialog elements to fit better in)
Child:  632364288039a4ec92dcfc64029b1201797b107d (Holo dialog formatting)
Branches: remotes/korg/sprdroid4.4_sfphone, remotes/m/sprdroid4.4_sfphone
Follows: android-2.3.4_r0.9, android-2.3.4_r1, android-adt-0.9.9
Precedes: android-4.0.1_r1, android-4.0.1_r1.1, android-4.0.1_r1.2

    Dialog-o-rama!
    
    New styling for Holo dialogs. Now 76% easier for apps to create
    dialog-based layouts! (Less tricky padding and margin rules)
    
    Cancelable AlertDialogs now are canceled when the user touches
    outside.
    
    Dialogs in landscape mode will try not to fill the width of the
    screen.
    
    Change-Id: I621b5a19780883ee703a8492510451b480a0b8cc


   <LinearLayout android:id="@+id/buttonPanel"
@@ -113,27 +102,21 @@
         android:orientation="vertical"
         android:divider="?android:attr/dividerHorizontal"
         android:showDividers="beginning"
-        android:dividerPadding="16dip">
+        android:dividerPadding="0dip">
         <LinearLayout
             style="?android:attr/buttonBarStyle"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:orientation="horizontal"
-            android:paddingLeft="2dip"
-            android:paddingRight="2dip"
+            android:layoutDirection="locale"
             android:measureWithLargestChild="true">
-            <LinearLayout android:id="@+id/leftSpacer"
-                android:layout_weight="0.25"
-                android:layout_width="0dip"
-                android:layout_height="wrap_content"
-                android:orientation="horizontal"
-                android:visibility="gone" />
-            <Button android:id="@+id/button1"
+            <Button android:id="@+id/button2"
                 android:layout_width="0dip"
                 android:layout_gravity="left"
                 android:layout_weight="1"
                 android:maxLines="2"
                 style="?android:attr/buttonBarButtonStyle"
+                android:textSize="14sp"
                 android:minHeight="@dimen/alert_dialog_button_bar_height"
                 android:layout_height="wrap_content" />
             <Button android:id="@+id/button3"
@@ -142,22 +125,18 @@
                 android:layout_weight="1"
                 android:maxLines="2"
                 style="?android:attr/buttonBarButtonStyle"
+                android:textSize="14sp"
                 android:minHeight="@dimen/alert_dialog_button_bar_height"
                 android:layout_height="wrap_content" />
-            <Button android:id="@+id/button2"
+            <Button android:id="@+id/button1"
                 android:layout_width="0dip"
                 android:layout_gravity="right"
                 android:layout_weight="1"
                 android:maxLines="2"
                 android:minHeight="@dimen/alert_dialog_button_bar_height"
                 style="?android:attr/buttonBarButtonStyle"
+                android:textSize="14sp"
                 android:layout_height="wrap_content" />
-            <LinearLayout android:id="@+id/rightSpacer"
-                android:layout_width="0dip"
-                android:layout_weight="0.25"
-                android:layout_height="wrap_content"
-                android:orientation="horizontal"
-                android:visibility="gone" />
         </LinearLayout>
      </LinearLayout>
 </LinearLayout>





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值