自定义的AlertDialog(shape,selector)

大家在开发的过程中,可能都碰过这样的问题,系统提供的AlertDialog就是一个矩形的大白框,然后两个按钮,一个代表确定,一个代表取消。这样再调用的过程中,整个界面显得过於单调,如果应用里面的界面大多都是鲜艳的颜色,这样显得更加丑陋。下面,我将针对这个问题进行详细的讲解。

最重要的工作:
要准备一个xml文件,对话框里面显示这个界面;
我在这个里面主要用到了selector+shape,这个界面就是用这两个东西做出来的。如果这个东西用的不熟的可以直接看我上几期的微博android中shape的使用selector里面使用shape

先看一下效果图吧
弹出对话框
这里写图片描述

点击按钮时
这里写图片描述

这里面和我们系统自带的对话框表面上有什么不同点呢?
1.整体布局是圆角矩阵,而系统自带的是矩形;
2.里面每个地方的颜色全部由自己来控制,系统的只可以控制里面的文字;
3.按钮的位置和点击效果完全由自己控制。

怎么实现的呢?
1.准备xml文件
myalertdialog.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!--对话框的有效区域-->
    <RelativeLayout
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_gravity="center_vertical"
        android:id="@+id/relativeLayout"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        <!--下面这个颜色尤为重要,否则你会发现四个边角空为白色(因为这个大的布局里面放圆角矩形,所以会空出来未填充的地方)-->
        android:background="#646464" >
        <!--上方天蓝色的头部(左上角,右上角为圆角)-->
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="80dp"
            android:layout_alignParentTop="true"
            <!--shape中定义-->
            android:background="@drawable/topdialog"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true"
            android:gravity="center"
            android:id="@+id/relativeLayout2">


            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="确定吗?"
                android:textColor="#ffffff"
                android:textSize="30sp"
                android:id="@+id/textView2"
                android:layout_alignParentBottom="true"
                android:layout_centerHorizontal="true" />
        </RelativeLayout>

    <!--下方天放置按钮的底部(左下角,右下角为圆角)-->
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@+id/relativeLayout2"
            android:layout_alignLeft="@+id/relativeLayout2"
            android:layout_alignStart="@+id/relativeLayout2"
            <!--shape中定义-->
            android:background="@drawable/write_bg">
    <!--确认按钮-->
            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="确定"
                android:textColor="#7A787D"
                android:textSize="18sp"
                android:id="@+id/button3"
                android:layout_centerVertical="true"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true"
                android:layout_marginLeft="20dp"
                android:background="@drawable/press_up"/>
    <!--取消按钮-->
            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="取消"
                android:textColor="#7A787D"
                android:textSize="18sp"
                android:id="@+id/button4"
                android:layout_centerVertical="true"
                android:layout_alignParentRight="true"
                android:layout_alignParentEnd="true"
                android:layout_marginRight="20dp"
                android:background="@drawable/press_up"/>
        </RelativeLayout>

    </RelativeLayout>



</RelativeLayout>

头部蓝色
topdialog.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#00ffff"></solid>
    <corners android:topLeftRadius="10dp"
        android:topRightRadius="10dp"/>
    <padding
        android:bottom="10dp"
        android:left="10dp"
        android:right="10dp"
        android:top="10dp"/>
</shape>

不太清楚可以看android中shape的使用

下面灰色区域
write_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <solid android:color="#D6DADB"></solid>
    <corners android:bottomLeftRadius="10dp"
        android:bottomRightRadius="10dp"/>
    <padding
        android:bottom="10dp"
        android:left="10dp"
        android:right="10dp"
        android:top="10dp"/>
</shape>

按钮的控制
press_up.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!--未选中的状态-->
    <item android:state_selected="false">
        <shape>
            <solid android:color="#ACDCC4"></solid>
            <corners android:radius="10dp" />
            <padding android:bottom="10dp" android:left="10dp" android:right="10dp" android:top="10dp" />
        </shape>
    </item>
<!--选中的状态-->
    <item android:state_selected="true">
        <shape>
            <solid android:color="#89BD98"></solid>
            <corners android:radius="10dp" />
            <padding android:bottom="10dp" android:left="10dp" android:right="10dp" android:top="10dp" />
        </shape>
    </item>
</selector>

不太清楚可以看selector里面使用shape

android代码:

public class MyAlertDialogActivity extends AppCompatActivity{

    //点击这个按钮显示对话框
    Button btn;
    //对话框中左边的按钮
    Button button3;
    //对话框中右边的按钮
    Button button4;
    //蓝色区域可以手动的进行设置哪些文本
    TextView textView2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_alert_dialog);
        textView2 = (TextView) findViewById(R.id.textView2);

        btn = (Button) findViewById(R.id.button);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
            //创建一个AlertDialog对话框
                AlertDialog alertDialog = new AlertDialog.Builder(MyAlertDialogActivity.this).create();
                //显示
                alertDialog.show();
                Window window = alertDialog.getWindow();
                //对话框中显示的哪一个布局
                window.setContentView(R.layout.myalertdialog);
                //从该布局中获取相应的控件
                button3 = (Button) window.findViewById(R.id.button3);
                //点击事件
                button3.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        Toast.makeText(MyAlertDialogActivity.this,"1",Toast.LENGTH_SHORT).show();
                        button3.setSelected(true);
                        button4.setSelected(false);
                    }
                });
                button4 = (Button) window.findViewById(R.id.button4);
                button4.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        Toast.makeText(MyAlertDialogActivity.this,"2",Toast.LENGTH_SHORT).show();
                        button3.setSelected(false);
                        button4.setSelected(true);
                    }
                });
            }
        });

    }


}
发布了37 篇原创文章 · 获赞 4 · 访问量 7万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章