码迷,mamicode.com
首页 > 其他好文 > 详细

自定义可扩性很强的Dialog

时间:2014-12-10 12:36:47      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:自定义对话框   android自定义对话框   

在做项目时,很多时候会用的对话框,安卓默认的对话框又太丑了,不能满足我们的需要,下面我就介绍一种自定Dilog

先来看一下效果

bubuko.com,布布扣

可以看到上面分为三个部分,提示部分,中间的内容部分,还有下面两按钮部分。

我把这部分做成可控制的的,一般“提示”这个有需要的也有不需要的,那么不需要时可以隐藏,需要时可以显示


然后中间的这部分是你要提示的信息,这个布局呢也是设置成自定义布局,这个布局中你可以像我一样,只要一个TextView,展示提示信息即可,也可以根据自己的需要添加另外的控件,比如EditText,等,都是在一个布局中设置就ok


下面的按钮部分呢也是自定义的两个按钮布局,分别放在drawable文件加下,这个按钮你可以手动修改他的样式,这里我就用一种了,一会再说怎么修改


好了接下来做中主要的部分,废话不多说上代码

package com.mydialog.widget;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Color;
import android.util.TypedValue;
import android.view.*;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;
import com.mydiaolg.activity.R;


/**
 * 自定义Dialog
 */
public class CustomDialog {
    private Context context;
    private AlertDialog ad;
    private TextView title;
    private LinearLayout titleLayout;
    private LinearLayout contentLayout;
    private LinearLayout buttonLayout;

    public CustomDialog(Context context) {
        this.context = context;
        ad = new AlertDialog.Builder(context).create();
        ad.setCancelable(false);
        ad.show();
        Window window = ad.getWindow();
        window.setContentView(R.layout.custom_dialog);
        //设置dialog的宽度
        WindowManager.LayoutParams lp = window.getAttributes();

       // 获取屏幕宽、高用
        Display d = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
        lp.width = (int) (d.getWidth() * 0.85);
        window.setAttributes(lp);
        // 解决AlertDialog弹不出输入法的问题
        window.clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

        //初始化控件
        title = (TextView) window.findViewById(R.id.reminder_title);
        titleLayout = (LinearLayout) window.findViewById(R.id.dialog_title);
        contentLayout = (LinearLayout) window.findViewById(R.id.dialog_content);
        buttonLayout = (LinearLayout) window.findViewById(R.id.dialog_btn);
    }


     /**
     * 设置title id
     */

    public void setTitleName(int resId) {
        title.setText(resId);
    }

    /**
     * 设置title 内容
     * @param titleName
     */
    public void setTitleName(String titleName) {
        title.setText(titleName);
    }

   /**获取titile布局view*/

    public TextView getTitleView() {
        return title;
    }

    /**
     * 显示或隐藏头部
     *
     * @param isShow 是否显示头部
     */
    public void showTitle(boolean isShow) {
        if (isShow) {
            titleLayout.setVisibility(View.VISIBLE);
        } else {
            titleLayout.setVisibility(View.GONE);
        }
    }

    /**
     * 设置内容
     *
     * @param layoutId 布局id
     */
    public void setContentView(int layoutId, LayoutParams params) {
        LayoutInflater inflaterDl = LayoutInflater.from(context);
        View view = inflaterDl.inflate(layoutId, null);
        contentLayout.addView(view, params);
        contentLayout.setVisibility(View.VISIBLE);
    }

    /**
     * 设置内容
     *
     * @param view   视图
     * @param params 布局参数
     */
    public void setContentView(View view, LayoutParams params) {
        contentLayout.removeAllViews();
        contentLayout.addView(view, params);
        contentLayout.setVisibility(View.VISIBLE);
    }

    public View getContentView() {
        return contentLayout;
    }

    /**
     * 设置按钮
     *
     * @param text     按钮显示文字
     * @param resId    按钮背景图片布局
     * @param listener 按钮点击事件
     */
    public void setButton(String text, int resId, final View.OnClickListener listener) {
        TextView button = new TextView(context);
        LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,

         LayoutParams.WRAP_CONTENT, 1);
        button.setLayoutParams(params);
        button.setGravity(Gravity.CENTER);
        button.setBackgroundResource(resId);
        button.setText(text);
        button.setTextColor(Color.WHITE);
        button.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
        button.setOnClickListener(listener);
        params.setMargins(dip2px(context, 15), 0, dip2px(context, 15), 0);
        button.setLayoutParams(params);
        buttonLayout.addView(button);
        buttonLayout.setVisibility(View.VISIBLE);
    }

    /**
     * 关闭对话框
     */
    public void dismiss() {
        ad.dismiss();
    }

    /**
     * 展示对话框
     */
    public void show() {
        ad.show();
    }

    /**
     * 设置是否可以关闭
     *
     * @param cancelable true或false
     */
    public void setCancelable(boolean cancelable) {
        ad.setCancelable(cancelable);
    }

    /**
     * 设置是否可以点击dialog外面关闭dialog
     *
     * @param canceledOnTouchOutside true或false
     */
    public void setCanceledOnTouchOutside(boolean canceledOnTouchOutside) {
        ad.setCanceledOnTouchOutside(canceledOnTouchOutside);
    }
    public static int dip2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }
    /**
     * 设置dialog消失事件
     *
     * @param onDismissListener dialog消失事件
     */
    public void setOnDismissListener(DialogInterface.OnDismissListener onDismissListener) {
        ad.setOnDismissListener(onDismissListener);
    }
}

下面来看下custom_dialog.xml布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:background="@drawable/bg_dialog"
    android:paddingBottom="15dp"
    android:paddingTop="15dp">

    <LinearLayout
        android:id="@+id/dialog_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="15dp"
        android:orientation="vertical"
        android:paddingLeft="15dp"
        android:paddingRight="15dp">

        <TextView
            android:id="@+id/reminder_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp"
            android:textColor="#ff323232"
            android:textSize="22sp" />

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:src="@drawable/bg_public_line"
            android:contentDescription="@null"
            android:scaleType="fitXY" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/dialog_content"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal"
        android:paddingLeft="15dp"
        android:paddingRight="15dp"
        android:visibility="gone" />


    <LinearLayout
        android:id="@+id/dialog_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginTop="15dp"
        android:visibility="gone" />
</LinearLayout>

主要的东西就在上面了,下面我们来调用,这里我就把调用过程放在一个方法里

大家可以根据自己需要调用

  /**
     * 弹出对话框
     */
    private  void  showDialog(){
        LinearLayout.LayoutParams params = new       

        LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,

        LinearLayout.LayoutParams.WRAP_CONTENT);
        LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
        View mDialogView = inflater.inflate(R.layout.dialog_public_content, null);
        TextView textView = (TextView) mDialogView.findViewById(R.id.my_content_text);
        textView.setText("你确定好做XXX事情吗?");
        final CustomDialog customDialog = new CustomDialog(MainActivity.this);
        customDialog.showTitle(true);
        customDialog.setTitleName(R.string.pubilc_dialog_title);
        customDialog.setContentView(mDialogView, params);
        //取消
        customDialog.setButton(getString(R.string.public_cancel), 

         R.drawable.btn_cancel_selector, new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                customDialog.dismiss();
            }
        });
        //确定
        customDialog.setButton(getString(R.string.public_ok), 

        R.drawable.btn_ok_selector, new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //确定事件,这里可以监听你要确定的事情,例如提交数据等
                customDialog.dismiss();
            }
        });
    }


这里有三个布局dialog_public_content.xml展示你提示的内容信息的,好有就是放在drawable下的btn_cancel_selector.xml,和btn_ok_selector.xml,两个按钮了,

下面来看下dialog_public_content.xml,这个布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:gravity="center_vertical">


    <TextView
        android:id="@+id/my_content_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#ff333333"
        android:textSize="16sp" />
</LinearLayout>

这个TextVIew就是最开始图中看到的“你确定要做XXX 事情吗?”对应的TextVIew,在这个布局中你可以根据自己需要修改布局中的控件,然后调用就ok

这么做为了扩展性,例如我可在这布局中设置EditText,提示用户输入某些信息等


那么btn_cancel_selector.xml,和btn_ok_selector.xml,两个按钮了布局是一样的,只是里面的图片不一样罢了

你可以根据需要写两可以只用一个,好了看下btn_ok_selector.xml中的内容吧

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/bg_btn_ok_press" android:state_pressed="true" />
    <item android:drawable="@drawable/bg_btn_ok_normal" />
</selector>


好了大功告成,你可以直接调用了,下面我来调用一下

bubuko.com,布布扣

这个是一个简单的调用过程,大家知道怎么使用就ok了,

部分的资源文件图片什么的放在了drawable-hdip文件夹中,

下面我把Demo的地址给大家,有需要的可以去下载看一下

下载地址是:http://download.csdn.net/detail/shaozucheng/8243089




自定义可扩性很强的Dialog

标签:自定义对话框   android自定义对话框   

原文地址:http://blog.csdn.net/shaozucheng/article/details/41843377

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!