自定義dialog

重寫樣式豪椿、重寫show方法解決寬度高度無法填充的問題

@Override
    public void show() {
        super.show();
        /**
         * 設(shè)置寬度全屏锌介,放在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主題

或者
這個方法多次調(diào)用會報錯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設(shè)置圓角,可以分矩形的四個角分別設(shè)置圓角
如:<corners android:radius="10dp" />
注:如果布局使用了這個shape超全,最好再設(shè)置一下margin或者padding咆霜,不然有可能被其內(nèi)容覆蓋而導(dǎo)致圓角設(shè)置失敗邓馒,因為布局里面的內(nèi)容如果有設(shè)置過背景的話,就會被覆蓋
解決方案:在代碼中設(shè)置圓角背景
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;設(shè)置dialog的位置 按需設(shè)置
        layoutParams.width = point.x * 9 / 10;
        layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
        //getWindow().getDecorView().setPadding(0, 0, 0, 0);按需設(shè)置
        getWindow().setAttributes(layoutParams);
取消點擊消失
       if (mDialog == null) {  
            mDialog = new MyDialog(getActivity());  
            mDialog.setCanceledOnTouchOutside(false);//點擊外部是否可取消
            mDialog.setCancelable(false);  //點擊返回鍵是否可取消
        }  
java.lang.IllegalArgumentException
該異常表示view沒有添加到窗口管理器蛾坯,通常是我們dismiss對話框的時候光酣,activity已經(jīng)不存在了,建議不要在非UI線程操作對話框脉课。
[解決方案]:常發(fā)生這類Exception的情形都是救军,有一個費時的線程操作,需要顯示一個Dialog倘零,在任務(wù)開始的時候顯示一個對話框唱遭,然后當任務(wù)完成了在Dismiss對話框,如果在此期間如果Activity因為某種原因被殺掉且又重新啟動了呈驶,那么當dialog調(diào)用dismiss的時候WindowManager檢查發(fā)現(xiàn)Dialog所屬的Activity已經(jīng)不存在拷泽,所以會報錯。
要避免此類Exception袖瞻,就要正確的使用對話框司致,也要正確的使用線程:
1.不要在非UI線程中使用對話框創(chuàng)建,顯示和取消對話框聋迎;
2.盡量少用單獨線程脂矫,出發(fā)是真正的耗時操作采用線程,線程也不要直接用Java式的匿名線程霉晕,除非是那種單純的操作庭再,操作完成不需要做其他事情的捞奕。
3.如果是在fragment中發(fā)起異步網(wǎng)絡(luò)的回調(diào)中進行dialog的操作,那么在操作之前拄轻,需要判斷 isAdd( )缝彬,避免fragment被回收了但是還要求dialog去dismiss
4.對Dialog提前進行關(guān)閉
//在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?

產(chǎn)生原因:

dialog要附屬的activity或者view還沒創(chuàng)建或者已經(jīng)銷毀

傳入的context是getApplicationContext,applicationContext是整個APP的環(huán)境哺眯,不代表任何activity或者view谷浅,dialog不知道附屬在哪里,所以報錯

奶卓。一疯。。夺姑。窿撬。迎瞧。

解決:

在正確的時間彈出dialog。傳入activity的或其他正確的context,他才知道要附屬在誰的身上馍资。

使用

<!-- 自定義優(yōu)惠券 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[] { "半透明", "活力橙", "衛(wèi)士藍", "金屬灰",
    "蘋果綠" };
    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;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市旬薯,隨后出現(xiàn)的幾起案子般又,更是在濱河造成了極大的恐慌,老刑警劉巖丐黄,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斋配,死亡現(xiàn)場離奇詭異,居然都是意外死亡灌闺,警方通過查閱死者的電腦和手機艰争,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來桂对,“玉大人甩卓,你說我怎么就攤上這事〗缎保” “怎么了逾柿?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蛛勉。 經(jīng)常有香客問我鹿寻,道長,這世上最難降的妖魔是什么诽凌? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任毡熏,我火速辦了婚禮,結(jié)果婚禮上侣诵,老公的妹妹穿的比我還像新娘痢法。我一直安慰自己狱窘,他們只是感情好,可當我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布财搁。 她就那樣靜靜地躺著蘸炸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪尖奔。 梳的紋絲不亂的頭發(fā)上搭儒,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天,我揣著相機與錄音提茁,去河邊找鬼淹禾。 笑死,一個胖子當著我的面吹牛茴扁,可吹牛的內(nèi)容都是我干的铃岔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼峭火,長吁一口氣:“原來是場噩夢啊……” “哼毁习!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起卖丸,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤纺且,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后坯苹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體隆檀,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年粹湃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泉坐。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡为鳄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出腕让,到底是詐尸還是另有隱情孤钦,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布纯丸,位于F島的核電站偏形,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏觉鼻。R本人自食惡果不足惜俊扭,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坠陈。 院中可真熱鬧萨惑,春花似錦捐康、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至姐仅,卻和暖如春花枫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背掏膏。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工乌昔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人壤追。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓磕道,卻偏偏與公主長得像,于是被迫代替她去往敵國和親行冰。 傳聞我的和親對象是個殘疾皇子溺蕉,可洞房花燭夜當晚...
    茶點故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內(nèi)容