相信现在Android软件开发员,都经常用到这种方式弹出对话框的。Android继承DialogFragment弹出dialog对话框,这样弹出有很多可以灵活处理地方,想什么启动,什么时候数据接口返回都可以,有自已layout布局,生命周期。下面看看我写demo。

本文代码下载:请点击这里

转载请注明出处:http://blog.csdn.net/qq_16064871

一、MainActivity

[java] view plain copy
  1. packagecom.example.fragmentdialogdemo;
  2. importcom.example.fragmentdialogdemo.TestDialog.onTestListener;
  3. importandroid.os.Bundle;
  4. importandroid.support.v4.app.FragmentActivity;
  5. importandroid.view.Menu;
  6. importandroid.view.View;
  7. importandroid.view.View.OnClickListener;
  8. importandroid.widget.Button;
  9. importandroid.widget.TextView;
  10. importandroid.widget.Toast;
  11. publicclassMainActivityextendsFragmentActivityimplementsOnClickListener,
  12. onTestListener{
  13. privateStringmstrName="";
  14. privateStringmstrHigh="";
  15. @Override
  16. protectedvoidonCreate(BundlesavedInstanceState){
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.activity_main);
  19. initUI();
  20. }
  21. privatevoidinitUI(){
  22. ButtonbuttonTest=(Button)findViewById(R.id.buttonTest);
  23. buttonTest.setOnClickListener(this);
  24. }
  25. @Override
  26. publicbooleanonCreateOptionsMenu(Menumenu){
  27. getMenuInflater().inflate(R.menu.main,menu);
  28. returntrue;
  29. }
  30. //接口回调的函数
  31. @Override
  32. publicvoidonTestListener(intuniqueIdentifier,StringstrName,
  33. StringstrHigh){
  34. if(uniqueIdentifier==1){
  35. Toast.makeText(getApplicationContext(),
  36. "姓名:"+strName+",身高:"+strHigh,Toast.LENGTH_LONG)
  37. .show();
  38. TextViewtextView1=(TextView)findViewById(R.id.textView1);
  39. textView1.setText("姓名:"+strName+",身高:"+strHigh);
  40. }
  41. mstrName=strName;
  42. mstrHigh=strHigh;
  43. }
  44. @Override
  45. publicvoidonClick(Viewarg0){
  46. switch(arg0.getId()){
  47. caseR.id.buttonTest:
  48. //实例化TestDialog,可以传参数进去,例如标题,或者其他参数,还有一个唯一码.
  49. TestDialogdialog=newTestDialog().newInstance("请输入",1,
  50. mstrName,mstrHigh);
  51. dialog.show(this.getSupportFragmentManager(),"TestDialog");
  52. break;
  53. default:
  54. break;
  55. }
  56. }
  57. }
里面都有一些注释了,有些时候也要主要看我导入包。

二、TestDialog

[java] view plain copy
  1. packagecom.example.fragmentdialogdemo;
  2. importandroid.app.Activity;
  3. importandroid.app.AlertDialog;
  4. importandroid.app.Dialog;
  5. importandroid.content.DialogInterface;
  6. importandroid.os.Bundle;
  7. importandroid.support.v4.app.DialogFragment;
  8. importandroid.view.View;
  9. importandroid.widget.Button;
  10. importandroid.widget.EditText;
  11. publicclassTestDialogextendsDialogFragment{
  12. //mUniqueFlag作用是唯一码,可以使返回时做判断
  13. privateintmUniqueFlag=-1;
  14. privateonTestListenermOnListener;
  15. privateEditTextmeditTextName,meditTextHigh;
  16. protectedButtonmButtonPositive;
  17. /**
  18. *新建实例
  19. *
  20. *@paramtitle
  21. *@paramunique
  22. *@paramstrName
  23. *@paramstrHigh
  24. *@return
  25. */
  26. publicstaticTestDialognewInstance(Stringtitle,intunique,
  27. StringstrName,StringstrHigh){
  28. TestDialogtDialog=newTestDialog();
  29. Bundleargs=newBundle();
  30. args.putString("SelectTemplateTitle",title);
  31. args.putInt("MultipleTemplate",unique);
  32. args.putString("TemplateName",strName);
  33. args.putString("TemplateHigh",strHigh);
  34. tDialog.setArguments(args);
  35. returntDialog;
  36. }
  37. publicinterfaceonTestListener{
  38. /**
  39. *
  40. *@paramuniqueIdentifier
  41. *唯一标识
  42. *@paramstrName
  43. *@paramstrHigh
  44. */
  45. publicabstractvoidonTestListener(intuniqueIdentifier,
  46. StringstrName,StringstrHigh);
  47. }
  48. //旋转时候保存
  49. @Override
  50. publicvoidonSaveInstanceState(BundleoutState){
  51. super.onSaveInstanceState(outState);
  52. outState.putString("InputName",meditTextName.getText().toString());
  53. outState.putString("InputHigh",meditTextHigh.getText().toString());
  54. }
  55. @Override
  56. publicDialogonCreateDialog(BundlesaveInstanceState){
  57. Stringtitle=getArguments().getString("SelectTemplateTitle");
  58. mUniqueFlag=getArguments().getInt("MultipleTemplate");
  59. AlertDialog.BuilderBuilder=newAlertDialog.Builder(getActivity())
  60. .setTitle(title)
  61. .setPositiveButton("确定",newDialogInterface.OnClickListener(){
  62. @Override
  63. publicvoidonClick(DialogInterfacedialog,intwhich){
  64. //触发数据回调
  65. if(mOnListener!=null)
  66. mOnListener.onTestListener(mUniqueFlag,
  67. meditTextName.getText().toString(),
  68. meditTextHigh.getText().toString());
  69. }
  70. }).setNegativeButton("取消",null);
  71. //添加xml布局
  72. Viewview=getActivity().getLayoutInflater().inflate(
  73. R.layout.test_dialog,null);
  74. setupUI(view);
  75. //旋转后,恢复数据
  76. if(saveInstanceState!=null){
  77. StringstrName=saveInstanceState.getString("InputName");
  78. if(strName!=null)
  79. meditTextName.setText(strName);
  80. StringstrHigh=saveInstanceState.getString("InputHigh");
  81. if(strHigh!=null)
  82. meditTextHigh.setText(strHigh);
  83. }
  84. Builder.setView(view);
  85. //创建对话框
  86. AlertDialogdialog=(AlertDialog)Builder.create();
  87. returndialog;
  88. }
  89. privatevoidsetupUI(Viewview){
  90. if(view==null)
  91. return;
  92. StringstrName=getArguments().getString("TemplateName");
  93. StringstrHigh=getArguments().getString("TemplateHigh");
  94. meditTextName=(EditText)view.findViewById(R.id.editTextName);
  95. meditTextHigh=(EditText)view.findViewById(R.id.editTextHigh);
  96. meditTextName.setText(strName);
  97. meditTextHigh.setText(strHigh);
  98. }
  99. //onAttach是关联activity的,用接口回调
  100. @Override
  101. publicvoidonAttach(Activityactivity){
  102. super.onAttach(activity);
  103. try{
  104. mOnListener=(onTestListener)activity;
  105. }catch(ClassCastExceptione){
  106. dismiss();
  107. }
  108. }
  109. }
继承DialogFragment,还有很多方法以及生命周期。自已写的可以多去查看方法。这上面写主要是数据传入,以及数据接口回调到activity。

三、activity的xml

[html] view plain copy
  1. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical"
  6. tools:context=".MainActivity">
  7. <TextView
  8. android:id="@+id/textView1"
  9. android:layout_width="match_parent"
  10. android:layout_height="80dp"
  11. android:gravity="center"
  12. android:textSize="18sp"
  13. android:text="点击button"/>
  14. <Button
  15. android:id="@+id/buttonTest"
  16. android:layout_width="wrap_content"
  17. android:layout_height="wrap_content"
  18. android:text="Button"/>
  19. </LinearLayout>

四、dialog对话框xml

[html] view plain copy
  1. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical"
  6. tools:context=".MainActivity">
  7. <TextView
  8. android:id="@+id/textView1"
  9. android:layout_width="match_parent"
  10. android:layout_height="80dp"
  11. android:gravity="center"
  12. android:textSize="18sp"
  13. android:text="点击button"/>
  14. <Button
  15. android:id="@+id/buttonTest"
  16. android:layout_width="wrap_content"
  17. android:layout_height="wrap_content"
  18. android:text="Button"/>
  19. </LinearLayout>

五、需要注意事项,关于这样使用版本问题

主要是sdk版本的问题,因为Fragment是在3.0提出的,为了兼容低版本,需要引入一个android-support-v4.jar,但是在实例化 FragmentManager时,不能用getFragmentManager()这个方法。如果找不到这个getFragmentManager()这个方法,就如下解决。

解决办法:

1、引入一个android-support-v4.jar

2、需要实例化的activity必须 extends FragmentActivity

3、用this.getSupportFragmentManager();来替代getFragmentManager()

也可以主要有上面我写的例子,也有这方面的原因。注意导入jar包。

六、效果图如下


到这里就结束了,欢迎交流学习。


更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. 一句话锁定MySQL数据占用元凶
  3. Android音频系统之AudioFlinger(三)
  4. Android(安卓)五大存储方式详解
  5. 【Android(安卓)Developers Training】 95. 创建一个同步适配器
  6. AIDL进程间传递复杂数据类型—AIDL传递android.os.Parcelable接
  7. 【Android(安卓)Developers Training】 100. 使用Intent修改联系
  8. uni-app提交表单到后端,接收表单数据
  9. Android(安卓)studio 插件推荐

随机推荐

  1. Android怎样修改系统时间?
  2. 一个android工程的运行过程
  3. 创建你的第一个AndroidApp
  4. android中的布局优化
  5. Android菜鸟日记6
  6. 命令行开发、编译、打包Android应用程序
  7. android 9.0 10.0 修改默认字体大小
  8. android IPC 通讯机制
  9. android EditText基本设置
  10. Android内存管理机制