重寫樣式豪椿、重寫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;
}