自定义dialog

重写样式、重写show方法解决宽度高度无法填充的问题

@Override
    public void show() {
        super.show();
        /**
         * 设置宽度全屏,放在show后面
         */
        LayoutParams layoutParams = getWindow().getAttributes();
        layoutParams.gravity=Gravity.BOTTOM;
        layoutParams.width= LayoutParams.MATCH_PARENT;
        layoutParams.height= LayoutParams.WRAP_CONTENT;
        getWindow().getDecorView().setPadding(0, 0, 0, 0);
        getWindow().setAttributes(layoutParams);

    }
dialog去标题
可以用主题去标题,只要有
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>

主题有这两个属性的,都可以,比如
android.R.style.Theme_DeviceDefault_Light_Dialog_NoActionBar主题

或者
这个方法多次调用会报错requestFeature() must be called before adding content
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
去背景
利用主题去背景
<item name="windowBackground">@color/transparent</item>
<item name="windowBackground">@null</item>

利用代码去背景
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));  // 有白色背景,加这句代码
或者
dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);//去背景
圆角矩形
对话框布局使用shape
shape的corners设置圆角,可以分矩形的四个角分别设置圆角
如:<corners android:radius="10dp" />
注:如果布局使用了这个shape,最好再设置一下margin或者padding,不然有可能被其内容覆盖而导致圆角设置失败,因为布局里面的内容如果有设置过背景的话,就会被覆盖
解决方案:在代码中设置圆角背景
Window window = mDialog.getWindow();
        if (window!=null){  window.setBackgroundDrawableResource(R.drawable.white_bg_rectangle_circle_angle);
        }


        WindowManager.LayoutParams layoutParams = getWindow().getAttributes();

        Point point = new Point();
        getWindow().getWindowManager().getDefaultDisplay().getSize(point);获取屏幕宽度
        //layoutParams.gravity = Gravity.BOTTOM;设置dialog的位置 按需设置
        layoutParams.width = point.x * 9 / 10;
        layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
        //getWindow().getDecorView().setPadding(0, 0, 0, 0);按需设置
        getWindow().setAttributes(layoutParams);
取消点击消失
       if (mDialog == null) {  
            mDialog = new MyDialog(getActivity());  
            mDialog.setCanceledOnTouchOutside(false);//点击外部是否可取消
            mDialog.setCancelable(false);  //点击返回键是否可取消
        }  
java.lang.IllegalArgumentException
该异常表示view没有添加到窗口管理器,通常是我们dismiss对话框的时候,activity已经不存在了,建议不要在非UI线程操作对话框。
[解决方案]:常发生这类Exception的情形都是,有一个费时的线程操作,需要显示一个Dialog,在任务开始的时候显示一个对话框,然后当任务完成了在Dismiss对话框,如果在此期间如果Activity因为某种原因被杀掉且又重新启动了,那么当dialog调用dismiss的时候WindowManager检查发现Dialog所属的Activity已经不存在,所以会报错。
要避免此类Exception,就要正确的使用对话框,也要正确的使用线程:
1.不要在非UI线程中使用对话框创建,显示和取消对话框;
2.尽量少用单独线程,出发是真正的耗时操作采用线程,线程也不要直接用Java式的匿名线程,除非是那种单纯的操作,操作完成不需要做其他事情的。
3.如果是在fragment中发起异步网络的回调中进行dialog的操作,那么在操作之前,需要判断 isAdd( ),避免fragment被回收了但是还要求dialog去dismiss
4.对Dialog提前进行关闭
//在Activity 中
if (!isDestroyed()&&!isFinishing()){
    mDialog.show();
}
//在fragment中
if (isAdded()){
    myProgressDialog.dismiss();
}

android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@41791b20 is not valid; is your activity running?

产生原因:

dialog要附属的activity或者view还没创建或者已经销毁

传入的context是getApplicationContext,applicationContext是整个APP的环境,不代表任何activity或者view,dialog不知道附属在哪里,所以报错

。。。。。。

解决:

在正确的时间弹出dialog。传入activity的或其他正确的context,他才知道要附属在谁的身上。

使用

<!-- 自定义优惠券 dialog -->
<style name="youhuiquan_dialog" parent="android:style/Theme.Dialog">
    <!--<item name="android:windowFrame">@null</item>-->
    <item name="android:windowNoTitle">true</item>
    <!--<item name="android:windowBackground">@drawable/white_bg_rectangle_shape</item>-->
    <!--<item name="android:windowBackground">@color/white</item>-->
    <!--<item name="android:windowIsFloating">true</item>-->
    <item name="android:windowIsTranslucent">false</item>
    <!--<item name="android:backgroundDimEnabled">true</item>-->
</style>
MyNumStyleDialog myNumStyleDialog = new MyNumStyleDialog(this);
myNumStyleDialog.show();


public class MyNumStyleDialog extends Dialog implements OnItemClickListener {
    private static String[] TITLES = new String[] { "半透明", "活力橙", "卫士蓝", "金属灰",
    "苹果绿" };
    private static int[] RESIDS = new int[] {
        R.drawable.myshape_half_transparent, R.drawable.myshape_orange,
        R.drawable.myshape_blue, R.drawable.myshape_gray,
        R.drawable.myshape_green };

    private Context mContext;
    private ListView mListView;
    private List<MyStyleBean> mListDatas;
    private MyLocNumStyleAdapter adapter;

    public MyNumStyleDialog(Context context, int theme) {
        super(context, R.style.mydlg_style);
        // TODO Auto-generated constructor stub
        this.mContext = context;
        Window window = getWindow();
        LayoutParams params = window.getAttributes();
        params.gravity=Gravity.BOTTOM;
    }

    public MyNumStyleDialog(Context context) {
        this(context,0);
        // TODO Auto-generated constructor stub
    }
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mydialog_number_style);
        initData();
        mListView = (ListView) findViewById(R.id.lv_my_number_style);
        mListView.setOnItemClickListener(this);
        adapter = new MyLocNumStyleAdapter();
        mListView.setAdapter(adapter);
    }
    
    private void initData() {
        mListDatas = new ArrayList<MyStyleBean>();
        for (int i = 0; i < TITLES.length; i++) {
            MyStyleBean myStyleBean = new MyStyleBean();
            myStyleBean.title=TITLES[i];
            myStyleBean.resId=RESIDS[i];
            mListDatas.add(myStyleBean);
        }
    }

    private class MyLocNumStyleAdapter extends BaseAdapter{

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return mListDatas.size();
        }

        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return mListDatas.get(position);
        }

        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            ViewHolder holder = null;
            if(convertView==null){
                convertView=View.inflate(mContext, R.layout.myitem_number_style, null);
                holder = new ViewHolder();
                holder.ivColor=(ImageView) convertView.findViewById(R.id.iv_my_number_style);
                holder.tvTitle=(TextView) convertView.findViewById(R.id.tv_my_number_style_title);
                holder.ivSelect=(ImageView) convertView.findViewById(R.id.iv_my_number_style_selected);
                convertView.setTag(holder);
            }else{
                holder=(ViewHolder) convertView.getTag();
            }
            MyStyleBean myStyleBean = (MyStyleBean) getItem(position);
            holder.ivColor.setImageResource(myStyleBean.resId);
            holder.tvTitle.setText(myStyleBean.title);
            int numberStyle = MySharedPreferencesUtils.getNumberStyle(mContext, 0);
            if(numberStyle==position){
                holder.ivSelect.setVisibility(View.VISIBLE);
            }else{
                holder.ivSelect.setVisibility(View.GONE);
            }
            
            
            return convertView;
        }
        
    }
    
    static class ViewHolder{
        ImageView ivColor;
        TextView tvTitle;
        ImageView ivSelect;
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
        // TODO Auto-generated method stub
        MySharedPreferencesUtils.setNumberStyle(mContext, position);
        adapter.notifyDataSetChanged();
        
    }

}

R.layout.mydialog_number_style

<?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="280dp"
    android:orientation="vertical" >
    
    <TextView 
        style="@style/MyTextNormal"
        android:background="#66000000"
        android:textColor="@color/white"
        android:padding="8dp"
        android:text="选择归属地样式"/>
    <ListView 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/lv_my_number_style"></ListView>
    
</LinearLayout>
public class MyStyleBean {

    public int resId;
    public String title;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容