DialogFragment和AlertDialog的使用
2014-01-16 19:03
253 查看
package com.example.fragments; import java.lang.ref.WeakReference; import java.lang.reflect.Field; import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v4.app.DialogFragment; import android.support.v4.app.FragmentManager; /** * <p> * 关于DialogFragment的使用 * </p> * 下午5:38:45 * * @auther delvikCoder */ public class CustomFragment extends DialogFragment { private static Context mContext; private AlertDialog alertDialog; @Override public Dialog onCreateDialog(Bundle savedInstanceState) { String str = getArguments().getString("title"); alertDialog = new AlertDialog.Builder(mContext, AlertDialog.THEME_HOLO_LIGHT).setTitle(str) .setMessage("这是个测试DialogFragment的列子") .setPositiveButton("确定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }).setNegativeButton("取消", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }).setCancelable(false) .create(); setButtonUseless(); return alertDialog; } @Override public void show(FragmentManager manager, String tag) { super.show(manager, tag); } /** * <p> * 这里利用反射使我们的AlertDialog在没特定使其消失情况下,点击按钮不消失 具体看:<a * href="http://blog.csdn.net/abby_dcy/article/details/6049535">看博客</a> * </p> * void */ public void setButtonUseless() { Field field; try { field = alertDialog.getClass().getDeclaredField("mAlert"); field.setAccessible(true); Object obj = field.get(alertDialog); field = obj.getClass().getDeclaredField("mHandler"); field.setAccessible(true); field.set(obj, new ButtonHandler(null)); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } private static final class ButtonHandler extends Handler { // Button clicks have Message.what as the BUTTON{1,2,3} constant private static final int MSG_DISMISS_DIALOG = 1; private WeakReference<DialogInterface> mDialog; public ButtonHandler(DialogInterface dialog) { mDialog = new WeakReference<DialogInterface>(dialog); } @Override public void handleMessage(Message msg) { switch (msg.what) { case DialogInterface.BUTTON_POSITIVE: case DialogInterface.BUTTON_NEGATIVE: case DialogInterface.BUTTON_NEUTRAL: ((DialogInterface.OnClickListener) msg.obj).onClick( mDialog.get(), msg.what); break; // 下面这两句导致dialog消失 // case MSG_DISMISS_DIALOG: // ((DialogInterface) msg.obj).dismiss(); } } } /** * <p> * 标题 * </p> * * @param title * @return Fragment */ public static CustomFragment getFragment(Context context, String title) { mContext = context; CustomFragment fragment = new CustomFragment(); Bundle b = new Bundle(); b.putString("title", title); fragment.setArguments(b); return fragment; } }
Button btn = (Button) findViewById(R.id.button1ss); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { CustomFragment customFragment = (CustomFragment) CustomFragment .getFragment(MainActivity.this, "AlertDialog.THEME_HOLO_LIGHT"); customFragment.show(getSupportFragmentManager(), ""); } });
然后看几个效果:下面分别对应AlertDialog中的几种Theme
THEME_DEVICE_DEFAULT_LIGHT,THEME_TRADITIONAL,THEME_DEVICE_DEFAULT_DARK,THEME_HOLO_LIGHT
默认AlertDialog不管点击那个按钮都会消失,设置AlertDialog不消失,而有时候我们不想
其消失:
/** * <p> * 这里利用反射使我们的AlertDialog在没特定使其消失情况下,点击按钮不消失 具体看:<a * href="http://blog.csdn.net/abby_dcy/article/details/6049535">看博客</a> * </p> * void */ public void setButtonUseless() { Field field; try { field = alertDialog.getClass().getDeclaredField("mAlert"); field.setAccessible(true); Object obj = field.get(alertDialog); field = obj.getClass().getDeclaredField("mHandler"); field.setAccessible(true); field.set(obj, new ButtonHandler(null)); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } }
可以研究下:
static int resolveDialogTheme(Context context, int resid) { if (resid == THEME_TRADITIONAL) { return com.android.internal.R.style.Theme_Dialog_Alert; } else if (resid == THEME_HOLO_DARK) { return com.android.internal.R.style.Theme_Holo_Dialog_Alert; } else if (resid == THEME_HOLO_LIGHT) { return com.android.internal.R.style.Theme_Holo_Light_Dialog_Alert; } else if (resid == THEME_DEVICE_DEFAULT_DARK) { return com.android.internal.R.style.Theme_DeviceDefault_Dialog_Alert; } else if (resid == THEME_DEVICE_DEFAULT_LIGHT) { return com.android.internal.R.style.Theme_DeviceDefault_Light_Dialog_Alert; } else if (resid >= 0x01000000) { // start of real resource IDs. return resid; } else { TypedValue outValue = new TypedValue(); context.getTheme().resolveAttribute(com.android.internal.R.attr.alertDialogTheme, outValue, true); return outValue.resourceId; } }
private AlertController mAlert;
相关文章推荐
- Merge Two Sorted Lists
- 寒假第三天--栈和队列--数据结构实验之栈四:括号匹配 (栈)
- PCI的imagework已由freeview软件代替
- PCI的imagework已由freeview软件代替
- 让 CentOS 启动时不启动桌面服务
- poj2070
- 寒假第三天--栈和队列--数据结构实验之栈四:括号匹配 (数组)
- Hibernate JPA 中配置Ehcache二级缓存
- Linear discriminant analysis (LDA)学习笔记
- MongoDB C#驱动中Query几个方法 (转)
- gets函数的漏洞
- HDU 1261(全排列,大数乘除)
- Hibernate学习笔记之EHCache的配置
- frameset中的frame去除进度条
- Spring集成ActiveMQ 推荐
- 函数模板
- easyUI 中datatGrid操作
- 寒假第三天--栈和队列--约瑟夫问题 (数组)
- 为什么开发人员工作10多年了还会迷茫?没有安全感?
- s5pv210 android4.0.3调试,如何去掉SGX540硬件加速