Android 继承DialogFragment弹出dialog对话框

来源:互联网 发布:java中的finally 编辑:程序博客网 时间:2024/05/16 03:00

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

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

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

一、MainActivity

[java] view plaincopy
  1. package com.example.fragmentdialogdemo;  
  2.   
  3. import com.example.fragmentdialogdemo.TestDialog.onTestListener;  
  4. import android.os.Bundle;  
  5. import android.support.v4.app.FragmentActivity;  
  6. import android.view.Menu;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.widget.Button;  
  10. import android.widget.TextView;  
  11. import android.widget.Toast;  
  12.   
  13. public class MainActivity extends FragmentActivity implements OnClickListener,  
  14.         onTestListener {  
  15.   
  16.     private String mstrName = "";  
  17.     private String mstrHigh = "";  
  18.   
  19.     @Override  
  20.     protected void onCreate(Bundle savedInstanceState) {  
  21.         super.onCreate(savedInstanceState);  
  22.         setContentView(R.layout.activity_main);  
  23.   
  24.         initUI();  
  25.     }  
  26.   
  27.     private void initUI() {  
  28.         Button buttonTest = (Button) findViewById(R.id.buttonTest);  
  29.         buttonTest.setOnClickListener(this);  
  30.     }  
  31.   
  32.     @Override  
  33.     public boolean onCreateOptionsMenu(Menu menu) {  
  34.         getMenuInflater().inflate(R.menu.main, menu);  
  35.         return true;  
  36.     }  
  37.   
  38.     // 接口回调的函数  
  39.     @Override  
  40.     public void onTestListener(int uniqueIdentifier, String strName,  
  41.             String strHigh) {  
  42.         if (uniqueIdentifier == 1) {  
  43.             Toast.makeText(getApplicationContext(),  
  44.                     "姓名:" + strName + ",身高:" + strHigh, Toast.LENGTH_LONG)  
  45.                     .show();  
  46.             TextView textView1 = (TextView) findViewById(R.id.textView1);  
  47.             textView1.setText("姓名:" + strName + ",身高:" + strHigh);  
  48.         }  
  49.   
  50.         mstrName = strName;  
  51.         mstrHigh = strHigh;  
  52.     }  
  53.   
  54.     @Override  
  55.     public void onClick(View arg0) {  
  56.         switch (arg0.getId()) {  
  57.         case R.id.buttonTest:  
  58.             // 实例化TestDialog,可以传参数进去,例如标题,或者其他参数,还有一个唯一码.  
  59.             TestDialog dialog = new TestDialog().newInstance("请输入"1,  
  60.                     mstrName, mstrHigh);  
  61.             dialog.show(this.getSupportFragmentManager(), "TestDialog");  
  62.             break;  
  63.         default:  
  64.             break;  
  65.         }  
  66.   
  67.     }  
  68.   
  69. }  
里面都有一些注释了,有些时候也要主要看我导入包。

二、TestDialog

[java] view plaincopy
  1. package com.example.fragmentdialogdemo;  
  2.   
  3. import android.app.Activity;  
  4. import android.app.AlertDialog;  
  5. import android.app.Dialog;  
  6. import android.content.DialogInterface;  
  7. import android.os.Bundle;  
  8. import android.support.v4.app.DialogFragment;  
  9. import android.view.View;  
  10. import android.widget.Button;  
  11. import android.widget.EditText;  
  12.   
  13. public class TestDialog extends DialogFragment {  
  14.   
  15.     // mUniqueFlag作用是唯一码,可以使返回时做判断  
  16.     private int mUniqueFlag = -1;  
  17.     private onTestListener mOnListener;  
  18.     private EditText meditTextName, meditTextHigh;  
  19.     protected Button mButtonPositive;  
  20.   
  21.     /** 
  22.      * 新建实例 
  23.      *  
  24.      * @param title 
  25.      * @param unique 
  26.      * @param strName 
  27.      * @param strHigh 
  28.      * @return 
  29.      */  
  30.     public static TestDialog newInstance(String title, int unique,  
  31.             String strName, String strHigh) {  
  32.         TestDialog tDialog = new TestDialog();  
  33.         Bundle args = new Bundle();  
  34.         args.putString("SelectTemplateTitle", title);  
  35.         args.putInt("MultipleTemplate", unique);  
  36.         args.putString("TemplateName", strName);  
  37.         args.putString("TemplateHigh", strHigh);  
  38.         tDialog.setArguments(args);  
  39.         return tDialog;  
  40.   
  41.     }  
  42.   
  43.     public interface onTestListener {  
  44.   
  45.         /** 
  46.          *  
  47.          * @param uniqueIdentifier 
  48.          *            唯一标识 
  49.          * @param strName 
  50.          * @param strHigh 
  51.          */  
  52.         public abstract void onTestListener(int uniqueIdentifier,  
  53.                 String strName, String strHigh);  
  54.     }  
  55.   
  56.     // 旋转时候保存  
  57.     @Override  
  58.     public void onSaveInstanceState(Bundle outState) {  
  59.         super.onSaveInstanceState(outState);  
  60.         outState.putString("InputName", meditTextName.getText().toString());  
  61.         outState.putString("InputHigh", meditTextHigh.getText().toString());  
  62.     }  
  63.   
  64.     @Override  
  65.     public Dialog onCreateDialog(Bundle saveInstanceState) {  
  66.         String title = getArguments().getString("SelectTemplateTitle");  
  67.         mUniqueFlag = getArguments().getInt("MultipleTemplate");  
  68.   
  69.         AlertDialog.Builder Builder = new AlertDialog.Builder(getActivity())  
  70.                 .setTitle(title)  
  71.                 .setPositiveButton("确定"new DialogInterface.OnClickListener() {  
  72.                     @Override  
  73.                     public void onClick(DialogInterface dialog, int which) {  
  74.                         // 触发数据回调  
  75.                         if (mOnListener != null)  
  76.                             mOnListener.onTestListener(mUniqueFlag,  
  77.                                     meditTextName.getText().toString(),  
  78.                                     meditTextHigh.getText().toString());  
  79.                     }  
  80.                 }).setNegativeButton("取消"null);  
  81.   
  82.         // 添加xml布局  
  83.         View view = getActivity().getLayoutInflater().inflate(  
  84.                 R.layout.test_dialog, null);  
  85.         setupUI(view);  
  86.   
  87.         // 旋转后,恢复数据  
  88.         if (saveInstanceState != null) {  
  89.             String strName = saveInstanceState.getString("InputName");  
  90.             if (strName != null)  
  91.                 meditTextName.setText(strName);  
  92.   
  93.             String strHigh = saveInstanceState.getString("InputHigh");  
  94.             if (strHigh != null)  
  95.                 meditTextHigh.setText(strHigh);  
  96.         }  
  97.         Builder.setView(view);  
  98.   
  99.         //创建对话框  
  100.         AlertDialog dialog = (AlertDialog) Builder.create();  
  101.         return dialog;  
  102.     }  
  103.   
  104.     private void setupUI(View view) {  
  105.         if (view == null)  
  106.             return;  
  107.         String strName = getArguments().getString("TemplateName");  
  108.         String strHigh = getArguments().getString("TemplateHigh");  
  109.         meditTextName = (EditText) view.findViewById(R.id.editTextName);  
  110.         meditTextHigh = (EditText) view.findViewById(R.id.editTextHigh);  
  111.   
  112.         meditTextName.setText(strName);  
  113.         meditTextHigh.setText(strHigh);  
  114.     }  
  115.   
  116.     // onAttach是关联activity的,用接口回调  
  117.     @Override  
  118.     public void onAttach(Activity activity) {  
  119.         super.onAttach(activity);  
  120.         try {  
  121.             mOnListener = (onTestListener) activity;  
  122.         } catch (ClassCastException e) {  
  123.             dismiss();  
  124.         }  
  125.     }  
  126.   
  127. }  
继承DialogFragment,还有很多方法以及生命周期。自已写的可以多去查看方法。这上面写主要是数据传入,以及数据接口回调到activity。

三、activity的xml

[html] view plaincopy
  1. <LinearLayout xmlns: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.   
  8.     <TextView  
  9.         android:id="@+id/textView1"  
  10.         android:layout_width="match_parent"  
  11.         android:layout_height="80dp"   
  12.         android:gravity="center"  
  13.         android:textSize="18sp"  
  14.         android:text="点击button" />  
  15.   
  16.     <Button  
  17.         android:id="@+id/buttonTest"  
  18.         android:layout_width="wrap_content"  
  19.         android:layout_height="wrap_content"  
  20.         android:text="Button" />  
  21.   
  22. </LinearLayout>  

四、dialog对话框xml

[html] view plaincopy
  1. <LinearLayout xmlns: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.   
  8.     <TextView  
  9.         android:id="@+id/textView1"  
  10.         android:layout_width="match_parent"  
  11.         android:layout_height="80dp"   
  12.         android:gravity="center"  
  13.         android:textSize="18sp"  
  14.         android:text="点击button" />  
  15.   
  16.     <Button  
  17.         android:id="@+id/buttonTest"  
  18.         android:layout_width="wrap_content"  
  19.         android:layout_height="wrap_content"  
  20.         android:text="Button" />  
  21.   
  22. </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包。

六、效果图如下


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


0 1
原创粉丝点击