自定义仿IOS的圆角AlertDialog

来源:互联网 发布:mac怎么查看压缩文件 编辑:程序博客网 时间:2024/06/06 03:30
先上个效果图

首先在styles文件里定义样式。
<!-- 自定义仿IOS的AlertDialog的样式 -->
<style name="AlertDialogStyle" parent="@android:style/Theme.Dialog">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowFrame">@null</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsTranslucent">true</item>
</style>
接着再drawable文件夹下自定义一个圆角的shape
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- radius 为圆角半径  -->
    <corners android:radius="20dp" ></corners>
    <solid android:color="#ffffffff" />
</shape>
然后自定义一个dialog的xml布局, 并且设置背景引用圆角shape,android:background="@drawable/bg_course_dialog"
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/bg_course_dialog"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="20dp"
        android:text="xxxxxx?"
        android:textColor="#000000"
        android:textSize="15sp" />


    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="xxxxxxx?"
        android:textColor="#000000"
        android:textSize="15sp" />


    <TextView
        android:id="@+id/time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="xxxxx"
        android:textColor="#000000"
        android:textSize="15sp" />


    <View
        android:layout_width="match_parent"
        android:layout_height="0.5dp"
        android:layout_marginTop="20dp"
        android:background="#dad6d6" />


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >


        <TextView
            android:id="@+id/dialog_cancel"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginBottom="8dp"
            android:layout_marginTop="8dp"
            android:layout_weight="1"
            android:clickable="true"
            android:gravity="center"
            android:text="取消"
            android:textColor="#007aff"
            android:textSize="18sp" />


        <View
            android:layout_width="0.5dp"
            android:layout_height="match_parent"
            android:background="#dad6d6" />


        <TextView
            android:id="@+id/dialog_commit"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginBottom="8dp"
            android:layout_marginTop="8dp"
            android:layout_weight="1"
            android:gravity="center"
            android:text="确认"
            android:textColor="#007aff"
            android:textSize="18sp" />
    </LinearLayout>
</LinearLayout>

然后是在activity中的代码
//初始化dialog
//这个style引用的就是一开始自定义在styles下的样式
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this, R.style.AlertDialogStyle);
AlertDialogdialog = builder.create();
dialog.setCancelable(false);//设置点击外部不能取消
//渲染刚才创建的dialog的自定义布局
View view = View.inflate(MainActivity.this,R.layout.dialog_view, null);
TextView title= (TextView) view.findViewById(R.id.title);
TextView name = (TextView) view.findViewById(R.id.name);
TextView time = (TextView) view.findViewById(R.id.time);
TextView tv_cancel = (TextView) view.findViewById(R.id.dialog_cancel);
TextView tv_commit = (TextView) view.findViewById(R.id.dialog_commit);
name.setText("这是name");
title.setText("这是title");
time.setText("这是time");
//这个是来设置dialog的宽高,这里设置宽为屏幕的0.85倍,高度为包裹内容。
WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
int display = windowManager.getDefaultDisplay();
android.widget.FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
(int) (display.getWidth() * 0.85), LayoutParams.WRAP_CONTENT);
//这里要注意,必须要先调用show()后才能调用setContentView(view, params),
//不然会报异常:requestFeature() must be called before adding content。
//原因大概是调用show()会对dialog的feature做一些处理,所以必须先show后才能setContentView去adding content。
dialog.show();
dialog.setContentView(view, params);
//对取消和确认按键做监听
tv_cancel.setOnClickListener(MainActivity.this);
tv_commit.setOnClickListener(MainActivity.this);

这样就完成了。


0 0