android 打造可复用的底部dialog

android 开发中我们会经常用到dialog提示框,有时候会有在屏幕底部显示dialog,但是官方并没有底部显示的dialog,这时候就需要我们自己动手自定义一个底部dialog。

不多说,直接上代码

先定义一个BottomDialog类,继承与Dialog
public class BottomDialog extends Dialog implements View.OnClickListener{

    private int layoutId;//要显示的布局文件id
    private Context context;
    private int[] listenedItems;//layout中要监听的控件id
    private OnBottomMenuItemClickListener listener;

    public BottomDialog( Context context, int layoutId, int[] listenedItems) {
        super(context, R.style.dialog_custom);
        this.context = context ;
        this.layoutId = layoutId;
        this.listenedItems = listenedItems;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(layoutId);//设置显示给定的布局文件

        Window window = getWindow();
        WindowManager.LayoutParams lp = window.getAttributes();
        lp.gravity = Gravity.BOTTOM;//设置底部显示
        WindowManager windowManager = ((Activity) context).getWindowManager(); // 宽度全屏
        //Display display = windowManager.getDefaultDisplay();
        lp.width = WindowManager.LayoutParams.MATCH_PARENT;//设置dialog宽度全屏
//        lp.width = display.getWidth()*9/10;//设置为屏幕的9/10宽
        lp.alpha = 1.0f;      //设置本身透明度
        lp.dimAmount = 0.5f;      //设置黑暗度
        this.setCanceledOnTouchOutside(true);//设置点击屏幕外取消

        //给控件添加监听事件
        for (int viewId : listenedItems) {
            findViewById(viewId).setOnClickListener(this);
        }
    }

 /**
     * 获取布局中的控件
     * @param viewId
     * @param <T>
     * @return
     */
    public <T extends View > T getView(int viewId){
        View view = findViewById(viewId);

        return (T) view;

    }
    @Override
    public void onClick(View v) {
        dismiss();
        listener.onBottomMenuItemClick(this,v);
    }

    //设置事件监听的接口
    public interface OnBottomMenuItemClickListener {

        void onBottomMenuItemClick(BottomDialog dialog, View view);

    }

    public void setOnBottomMenuItemClickListener(OnBottomMenuItemClickListener listener) {
        this.listener = listener;
    }
}

其中R.style.dialog_custom 为自己定义的样式

 <!-- dialog样式 -->
    <style name="dialog_custom" parent="@android:style/Theme.Dialog">
        <item name="android:windowIsFloating">true</item>    <!--是否浮在界面上-->
        <item name="android:windowIsTranslucent">false</item> <!--是否半透明-->
        <item name="android:windowNoTitle">false</item>       <!--是否有标题-->
        <item name="android:windowBackground">@android:color/transparent</item> <!--窗口背景色透明-->
        <item name="android:backgroundDimEnabled">true</item> <!--背景是否模糊显示-->
    </style>

然后再在activity中调用

final int[] views = new int[2];
views[0] = R.id.input_dialog_sure;
views[1] = R.id.input_dialog_cancel;
BottomDialog dialog = new BottomDialog(MainActivity.this,R.layout.input_dialog,views);
dialog.setOnBottomMenuItemClickListener(new BottomDialog.OnBottomMenuItemClickListener() {
                        @Override
                        public void onBottomMenuItemClick(BottomDialog dialog, View view) {
                            switch (view.getId()){
                                case R.id.input_dialog_sure:
                                    EditText editText1 = dialog.getView(R.id.input_dialog_edit);
                                        String content = editText1.getText().toString();
                                        Toast.makeText(MainActivity.this,content,Toast.LENGTH_SHORT).show();

                            }
                        }
                    });
                    dialog.show();

我的布局文件input_dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <LinearLayout
        android:orientation="vertical"
        android:background="@drawable/dialog_style"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:paddingTop="20dp"
            android:id="@+id/input_dialog_title"
            android:text="提示"
            android:textSize="20sp"
            android:textColor="#444444"
            android:layout_gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <LinearLayout
            android:paddingTop="20dp"
            android:paddingLeft="20dp"
            android:paddingRight="20dp"
            android:paddingBottom="10dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <EditText
                android:id="@+id/input_dialog_edit"
                android:layout_width="match_parent"
                android:layout_height="40dp" />
        </LinearLayout>

        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="#555555" />

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

            <TextView
                android:textSize="18sp"
                android:text="取消"
                android:textColor="#444444"
                android:gravity="center"
                android:id="@+id/input_dialog_cancel"
                android:layout_weight="1"
                android:layout_width="0dp"
                android:layout_height="60dp" />

            <View
                android:layout_width="1dp"
                android:layout_height="60dp"
                android:background="#555555" />

            <TextView
                android:textSize="18sp"
                android:text="确定"
                android:textColor="#444444"
                android:gravity="center"
                android:id="@+id/input_dialog_sure"
                android:layout_weight="1"
                android:layout_width="0dp"
                android:layout_height="60dp" />
        </LinearLayout>
    </LinearLayout>
</LinearLayout>

效果图如下
这里写图片描述

参考博客:http://blog.csdn.net/DickyQie/article/details/75505059

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值