转于:http://my.oschina.net/fengheju/blog/179218

--------------------------------------------------------------------------------------------

最近学习对话框时发现有两种类型的可供使用,一种是Dialog,另一种则是Android 3.0 引入的基于Fragment的DialogFragment。

从代码的编写角度看,Dialog使用起来要更为简单,但是Google则是推荐尽量使用DialogFragment(对于Android 3.0以下的版本,可以结合使用support包中提供的DialogFragment以及FragmentActivity)。今天试着用这两种方式来创建对话框,发现DialogFragment果然有一个非常好的特性(在手机配置变化,导致Activity需要重新创建时,例如旋屏,基于DialogFragment的对话框将会由FragmentManager自动重建,然而基于Dialog实现的对话框则没有这样的能力)。

下面是两段实例代码:

他们使用的界面都一样:(dialog.xml)

?
1 2 3 4 5 6 7 8 9 10 11 12 <? 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 = "match_parent" android:orientation = "vertical" > < ImageView android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:src = "@drawable/ic_launcher" /> </ LinearLayout >

1.基于Dialog实现的对话框

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 public class MainActivity extends Activity { private Button clk; private Dialog dialog; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); clk = (Button) findViewById(R.id.clk); dialog = new Dialog( this ); dialog.setContentView(R.layout.dialog); clk.setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { dialog.show(); } }); } }

当我们点击按钮时,会弹出对话框(内容为android logo),当我们旋转屏幕后,Activity重新创建,整个Activity的界面没有问题,而对话框消失了。

除此之外,其实还有一个问题,就是在logcat中会看到异常信息:Android..leaked .. window,这是因为在Activity结束之前,Android要求所有的Dialog必须要关闭。我们旋屏后,Activity会被重建,而上面的代码逻辑并没有考虑到对话框的状态以及是否已关闭。

于是将上述代码修改为:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 public class MainActivity extends Activity { private Button clk; private Dialog dialog; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); clk = (Button) findViewById(R.id.clk); dialog = new Dialog( this ); dialog.setContentView(R.layout.dialog); clk.setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { dialog.show(); } }); //用户恢复对话框的状态 if (savedInstanceState != null && savedInstanceState.getBoolean( "dialog_show" )) clk.performClick(); } /** * 用于保存对话框的状态以便恢复 */ @Override protected void onSaveInstanceState(Bundle outState) { super .onSaveInstanceState(outState); if (dialog != null && dialog.isShowing()) outState.putBoolean( "dialog_show" , true ); else outState.putBoolean( "dialog_show" , false ); } /** * 在Activity销毁之前,确保对话框以关闭 */ @Override protected void onDestroy() { super .onDestroy(); if (dialog != null && dialog.isShowing()) dialog.dismiss(); } }

2. 基于DialogFragment的对话框

与上面的对话框使用同样的界面布局,此处仅仅展现一个简单对话框,因此只重写了onCreateView方法

?
1 2 3 4 5 6 7 8 public class MyDialogFragment extends DialogFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.dialog, container, false ); return v; } }

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 public class MainActivity extends FragmentActivity { private Button clk; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); clk = (Button) findViewById(R.id.clk); clk.setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { MyDialogFragment mdf = new MyDialogFragment(); FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); mdf.show(ft, "df" ); } }); } }

这两段代码可以实现第一种方式的同样功能,此处我们并没有去关心对话框的重建,以及Activity销毁前对话框是否已关闭,这一切都是由FragmentManager来管理。

其实DialogFragment还拥有fragment的优点,即可以在一个Activity内部实现回退(因为FragmentManager会管理一个回退栈)

更多相关文章

  1. android通过Intent调用手机图片,音频,视频录音拍照等代码
  2. Android开源项目:微信打飞机游戏源代码
  3. android 开发常用代码备查[更新20150520]
  4. android菜单和对话框
  5. android常用代码积累
  6. android典型代码系列(八)------传递一个String进行MD5编码
  7. 如何在 Android 上优雅地实现截屏?(附代码)

随机推荐

  1. SQL 新增/修改 表字段列的类型等
  2. SQL Server中网络备份一例
  3. SQL语句导入导出大全
  4. SQL 外链接操作小结 inner join left joi
  5. MSSQL内外连接(INNER JOIN)语句详解
  6. 将Sql Server对象的当前拥有者更改成目标
  7. SQL数据类型详解
  8. SQL语句示例
  9. Access 数据类型与 MS SQL 数据类型的相
  10. 有用的SQL语句(删除重复记录,收缩日志)