上一篇文章http://blog.csdn.net/qq_33748378/article/details/54581422#comments介绍了自定义的AlertDialog,在此基础之上,再来看下常用的自定义的AlertDialog。

ItemDialog:

首先来看下android原生的itemDialog
package com.example.yk.dialogtest;import android.content.DialogInterface;import android.support.v7.app.AlertDialog;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.ArrayAdapter;import android.widget.Toast;public class ItemDialogActivity extends AppCompatActivity {    private String[] items={"a","b","c","d","e","d","f","g","h","i","j","k","l","m"};    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_item_dialog);               AlertDialog.Builder alertDialog=new AlertDialog.Builder(this);        alertDialog.setTitle("title");        alertDialog.setItems(items, new DialogInterface.OnClickListener() {            @Override            public void onClick(DialogInterface dialogInterface, int i) {               Toast.makeText(ItemDialogActivity.this, "点击了"+items[i], Toast.LENGTH_SHORT).show();            }        });                alertDialog.show();    }}
效果如图:

自定义的itemDialog:
package com.example.yk.dialogtest;import android.app.Dialog;import android.content.Context;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.TextView;/** * Created by yk on 2017/1/17. */public class itemDialog extends Dialog implements AdapterView.OnItemClickListener {    public interface OnDialogItemClickListener {        /**         * 点击item 事件的回调方法         * @param requestCode 用于区分某种情况下的showDialog         * @param position         * @param item         */        void onDialogItemClick(int requestCode, int position,String item);    }    private String title;    private Context context;    private String[] items;    private int requestCode;    private OnDialogItemClickListener listener;    public itemDialog(Context context, String title, String[] items, int requestCode, OnDialogItemClickListener listener) {        super(context, R.style.MyDialog);        this.context=context;        this.title=title;        this.items=items;        this.requestCode=requestCode;        this.listener=listener;    }    private TextView textView;    private ListView listView;    private ArrayAdapter adapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.item_dialog);        textView = (TextView) findViewById(R.id.tvItemDialogTitle);        listView = (ListView) findViewById(R.id.lvItemDialog);        adapter = new ArrayAdapter(context, R.layout.item_dialog_activity,R.id.text_view, items);        textView.setText(title);        listView.setAdapter(adapter);        listView.setOnItemClickListener(this);    }    @Override    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {        listener.onDialogItemClick(requestCode,i, adapter.getItem(i));        dismiss();    }}
item_dialog布局文件:
<?xml version="1.0" encoding="utf-8"?>        
MyDialog style:
item_dialog_activity布局文件:
<?xml version="1.0" encoding="utf-8"?>    
MainActivity中代码:
package com.example.yk.dialogtest;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.Toast;public class CustomItemDialog extends AppCompatActivity implements itemDialog.OnDialogItemClickListener {    private static final int REQUEST_CODE_SECOND = 2;    private String[] items={"a","b","c","d","e","d","f","g","h","i","j","k","l","m"};    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_custom_item_dialog);        itemDialog itemDialog=new itemDialog(this,"title",items,REQUEST_CODE_SECOND,this);        itemDialog.show();    }    @Override    public void onDialogItemClick(int requestCode, int position, String item) {        if(requestCode==REQUEST_CODE_SECOND){            Toast.makeText(this, item, Toast.LENGTH_SHORT).show();        }    }}
效果图:

EditDialog:

editDialog中代码:
package com.example.yk.dialogtest;import android.app.Dialog;import android.content.Context;import android.os.Bundle;import android.text.TextUtils;import android.view.View;import android.view.inputmethod.InputMethodManager;import android.widget.EditText;import android.widget.TextView;/** * Created by yk on 2017/1/18. */public class EditDialog extends Dialog implements View.OnClickListener {    public interface OnDialogButtonClickListener{        void onDialogButtonClick(int requestCode,boolean isPositiveBtn,String s);    }    private String title;    private String strPositive;    private String strNegative;    private int requestCode;    private Context context;    private OnDialogButtonClickListener listener;    public EditDialog(Context context,String title,String strNegative,String strPositive,int requestCode,OnDialogButtonClickListener listener) {        super(context,R.style.MyDialog);        this.context=context;        this.title=title;        this.strNegative=strNegative;        this.strPositive=strPositive;        this.requestCode=requestCode;        this.listener=listener;    }    private TextView tvTitle,tvCancel,tvConfirm;    private EditText etInput;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.layout_edit_dialog);        tvTitle= (TextView) findViewById(R.id.tv_title);        tvCancel= (TextView) findViewById(R.id.tv_cancel);        tvConfirm= (TextView) findViewById(R.id.tv_confirm);        etInput= (EditText) findViewById(R.id.edit_text);        tvTitle.setText(title);        if(TextUtils.isEmpty(tvConfirm.getText().toString().trim())){            tvCancel.setVisibility(View.GONE);        }else {            tvCancel.setVisibility(View.VISIBLE);        }        tvCancel.setOnClickListener(this);        tvConfirm.setOnClickListener(this);        tvTitle.postDelayed(new Runnable() {            @Override            public void run() {                showSoftKeyBoard();//弹出输入键盘            }        },100);    }    public void showSoftKeyBoard(){        InputMethodManager manager= (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);        manager.toggleSoftInput(0,InputMethodManager.HIDE_NOT_ALWAYS);    }    @Override    public void onClick(View view) {        switch (view.getId()){            case R.id.tv_confirm:                //点击确定按钮                listener.onDialogButtonClick(requestCode,true,etInput.getText().toString().trim());                break;            case R.id.tv_cancel:                //点击取消按钮                listener.onDialogButtonClick(requestCode,false,null);                break;        }        dismiss();    }}
layout_edit_dialog布局文件:
<?xml version="1.0" encoding="utf-8"?>                                        
drawable/bg_item_to_alpha:
<?xml version="1.0" encoding="utf-8"?>    
drawable/edit_item_text_bg:
<?xml version="1.0" encoding="utf-8"?>                
MianActivity中代码:
package com.example.yk.dialogtest;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.Toast;public class EditDialogActivity extends AppCompatActivity implements EditDialog.OnDialogButtonClickListener {    private static final int REQUEST_CODE_THIRD = 3;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_edit_dialog);        EditDialog editDialog=new EditDialog(this,"title","取消","确定",REQUEST_CODE_THIRD,this);        editDialog.show();    }    @Override    public void onDialogButtonClick(int requestCode, boolean isPositiveBtn, String s) {        if(requestCode==REQUEST_CODE_THIRD){            if(isPositiveBtn){                Toast.makeText(this, "输入的内容:"+s, Toast.LENGTH_SHORT).show();            }else {                Toast.makeText(this, "点击了取消", Toast.LENGTH_SHORT).show();            }        }    }}
效果图:
如果需要对editText输入的内容作限制,需要在EditDialog中添加如下代码:
CustomWatcher customWatcher=new CustomWatcher();        etInput.addTextChangedListener(customWatcher);
CustomWatcher:
private class CustomWatcher implements TextWatcher {        @Override        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {        }        @Override        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {        }        @Override        public void afterTextChanged(Editable editable) {            String s = editable.toString();            /**             * 不以小数点开头             */            if(s.length() ==1 && s.contains(".")){                editable.delete(0,1);                return;            }            /**             * 不能以00开头             */            if(s.startsWith("00")){                editable.delete(1,2);                return;            }            /**             * 整数部分最长为8位             */            if(!s.contains(".")){                if(s.length() == 9){                    editable.delete(8,9);                }                return;            }            /**             * 小数部分最多有2位             */            if(s.contains(".")){                int start = s.indexOf("." )+ 1;                int end=s.length();                if(end-start>2){                    editable.delete(start+2,s.length());                }                return;            }        }    }
效果截图:

LoadProgressDialog:

LoadProgressDialog中代码:
package com.example.yk.dialogtest;import android.app.Dialog;import android.content.Context;import android.os.Bundle;import android.widget.TextView;/** * Created by yk on 2017/1/18. */public class LoadProgressDialog extends Dialog{    private String message;    private boolean canCancel;    public LoadProgressDialog(Context context,String message,boolean canCancel) {        super(context);        this.message=message;        this.canCancel=canCancel;    }    private TextView textView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.layout_load_progress_dialog);        textView= (TextView) findViewById(R.id.tv_message);        setCancelable(canCancel);        textView.setText(message);    }}
MainActivty中代码:
package com.example.yk.dialogtest;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;public class LoadProgressActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_load_progress);        LoadProgressDialog dialog=new LoadProgressDialog(this,"加载中",true);        dialog.show();    }}
R.layout.layout_load_progress_dialog为:
<?xml version="1.0" encoding="utf-8"?>        
实现的效果:

在此基础之上,可以进一步添加自定义样式: 在LoadProgressDialog中改变的代码:
public LoadProgressDialog(Context context,String message,boolean canCancel) {        super(context,R.style.easy_dialog_style);        this.message=message;        this.canCancel=canCancel;    }
自定义样式R.style.easy_dialog_style为:
R.layout.layout_load_progress_dialog布局为:
<?xml version="1.0" encoding="utf-8"?>        
drawable/custom_progress_style:
<?xml version="1.0" encoding="utf-8"?>
效果:

控制LoadProgressDialog显示与不显示的工具类:

LoadProgressActivity中代码:
package com.example.yk.dialogtest;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;public class LoadProgressActivity extends AppCompatActivity {    private LoadProgressDialog dialog;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_load_progress);//        dialog = new LoadProgressDialog(this,"加载中",true);//        dialog.show();        LoadProgressUtil.showLoadProgressDialog(this,"加载中",true);    }}
LoadProgressUtil中代码:
package com.example.yk.dialogtest;import android.content.Context;import android.util.Log;/** * Created by yk on 2017/1/18. */public class LoadProgressUtil {    private static LoadProgressDialog loadProgressDialog;    public static void showLoadProgressDialog(Context context,String title, boolean canCancel){        if(loadProgressDialog == null){            loadProgressDialog=new LoadProgressDialog(context,title,canCancel);        }else {            if(loadProgressDialog.isShowing()){                return;            }        }//        Log.e("context",context.toString());//        Log.e("loadProgressDialog",loadProgressDialog.getContext().toString());        loadProgressDialog.show();    }    public static void cancelProgressDialog(){        if(loadProgressDialog==null){            return;        }else {            if(loadProgressDialog.isShowing()){                loadProgressDialog.dismiss();            }else {                return;            }        }    }    public static void progressDialogIsShow(){        loadProgressDialog.isShowing();    }}
如果像上面这样写的话,会发现,在第一次取消progressDialog,并且退出当前progressDialog所在的Activity,当第二次进入该progressDialog所在的Activity时是会报错的,错误原因:
Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@3d4e7354 is not valid; is your activity running?
查阅资料发现,对于AlertDialog来说,是需要依赖一个View,而View是对应于Activity的。那么为什么会报错呢,这里涉及到一个生命周期的问题了。静态变量private static LoadProgressDialog loadProgressDialog;需要等到系统GC的时候才会回收,第二次进入该activity时,此时的context是新的地址,而此时的progress Dialog的context还是上次的activity的,见下图: 解决的办法是:
package com.example.yk.dialogtest;import android.content.Context;import android.util.Log;/** * Created by yk on 2017/1/18. */public class LoadProgressUtil {    private static LoadProgressDialog loadProgressDialog;    public static void showLoadProgressDialog(Context context,String title, boolean canCancel){        if(loadProgressDialog == null){            loadProgressDialog=new LoadProgressDialog(context,title,canCancel);        }else if(loadProgressDialog.getContext() !=context){            cancelProgressDialog();            loadProgressDialog=new LoadProgressDialog(context,title,canCancel);        }//        Log.e("context",context.toString());//        Log.e("loadProgressDialog",loadProgressDialog.getContext().toString());        loadProgressDialog.show();    }    public static void cancelProgressDialog(){        if(loadProgressDialog==null){            return;        }else {            if(loadProgressDialog.isShowing()){                loadProgressDialog.dismiss();                loadProgressDialog=null;            }        }    }    public static boolean progressDialogIsShow(){        return (loadProgressDialog !=null && loadProgressDialog.isShowing());    }}

完整的项目源码:http://download.csdn.net/detail/qq_33748378/9740725

包含的内容:


更多相关文章

  1. Android拨号器的实现(四中点击事件)
  2. Android去掉标题栏和全屏
  3. android系统信息获取
  4. Android(安卓)如何隐藏标题栏和通知栏
  5. [Android开发常见问题-21] Android(安卓)近百个项目的源代码
  6. Ubuntu 14.10+NDK+ffmpeg编译+Android
  7. android scrollview组件禁止滑动的方法
  8. Android点击事件的四种写法
  9. Android(安卓)Studio 快捷键

随机推荐

  1. 使用和管理Android中Activity的切换动画(
  2. Android(安卓)ListView列表视图的使用方
  3. android 建立sdcard 并放文件 在程序中取
  4. 用Classpy分析.dex文件
  5. SystemServer(一):恢复出厂设置后wifi、数
  6. Spinner的功能和用法-通过XML生成
  7. ContentProvider的工作过程
  8. Android(安卓)安卓MVC架构
  9. Android(安卓)指纹识别注意升级问题
  10. Android中的System UI Visibility