標籤:android 布局 繼承 對話方塊 interface
相信現在Android軟體開發員,都經常用到這種方式彈出對話方塊的。Android繼承DialogFragment彈出dialog對話方塊,這樣彈出有很多可以靈活處理地方,想什麼啟動,什麼時候資料介面返回都可以,有自已layout布局,生命週期。下面看看我寫demo。
本文代碼下載:請點擊這裡
轉載請註明出處: http://blog.csdn.net/qq_16064871
一、MainActivity
package com.example.fragmentdialogdemo;import com.example.fragmentdialogdemo.TestDialog.onTestListener;import android.os.Bundle;import android.support.v4.app.FragmentActivity;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends FragmentActivity implements OnClickListener,onTestListener {private String mstrName = "";private String mstrHigh = "";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initUI();}private void initUI() {Button buttonTest = (Button) findViewById(R.id.buttonTest);buttonTest.setOnClickListener(this);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main, menu);return true;}// 介面回調的函數@Overridepublic void onTestListener(int uniqueIdentifier, String strName,String strHigh) {if (uniqueIdentifier == 1) {Toast.makeText(getApplicationContext(),"姓名:" + strName + ",身高:" + strHigh, Toast.LENGTH_LONG).show();TextView textView1 = (TextView) findViewById(R.id.textView1);textView1.setText("姓名:" + strName + ",身高:" + strHigh);}mstrName = strName;mstrHigh = strHigh;}@Overridepublic void onClick(View arg0) {switch (arg0.getId()) {case R.id.buttonTest:// 執行個體化TestDialog,可以傳參數進去,例如標題,或者其他參數,還有一個唯一碼.TestDialog dialog = new TestDialog().newInstance("請輸入", 1,mstrName, mstrHigh);dialog.show(this.getSupportFragmentManager(), "TestDialog");break;default:break;}}}
裡面都有一些注釋了,有些時候也要主要看我匯入包。
二、TestDialog
package com.example.fragmentdialogdemo;import android.app.Activity;import android.app.AlertDialog;import android.app.Dialog;import android.content.DialogInterface;import android.os.Bundle;import android.support.v4.app.DialogFragment;import android.view.View;import android.widget.Button;import android.widget.EditText;public class TestDialog extends DialogFragment {// mUniqueFlag作用是唯一碼,可以使返回時做判斷private int mUniqueFlag = -1;private onTestListener mOnListener;private EditText meditTextName, meditTextHigh;protected Button mButtonPositive;/** * 建立執行個體 * * @param title * @param unique * @param strName * @param strHigh * @return */public static TestDialog newInstance(String title, int unique,String strName, String strHigh) {TestDialog tDialog = new TestDialog();Bundle args = new Bundle();args.putString("SelectTemplateTitle", title);args.putInt("MultipleTemplate", unique);args.putString("TemplateName", strName);args.putString("TemplateHigh", strHigh);tDialog.setArguments(args);return tDialog;}public interface onTestListener {/** * * @param uniqueIdentifier * 唯一標識 * @param strName * @param strHigh */public abstract void onTestListener(int uniqueIdentifier,String strName, String strHigh);}// 旋轉時候儲存@Overridepublic void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);outState.putString("InputName", meditTextName.getText().toString());outState.putString("InputHigh", meditTextHigh.getText().toString());}@Overridepublic Dialog onCreateDialog(Bundle saveInstanceState) {String title = getArguments().getString("SelectTemplateTitle");mUniqueFlag = getArguments().getInt("MultipleTemplate");AlertDialog.Builder Builder = new AlertDialog.Builder(getActivity()).setTitle(title).setPositiveButton("確定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// 觸發資料回調if (mOnListener != null)mOnListener.onTestListener(mUniqueFlag,meditTextName.getText().toString(),meditTextHigh.getText().toString());}}).setNegativeButton("取消", null);// 添加xml布局View view = getActivity().getLayoutInflater().inflate(R.layout.test_dialog, null);setupUI(view);// 旋轉後,恢複資料if (saveInstanceState != null) {String strName = saveInstanceState.getString("InputName");if (strName != null)meditTextName.setText(strName);String strHigh = saveInstanceState.getString("InputHigh");if (strHigh != null)meditTextHigh.setText(strHigh);}Builder.setView(view);//建立對話方塊AlertDialog dialog = (AlertDialog) Builder.create();return dialog;}private void setupUI(View view) {if (view == null)return;String strName = getArguments().getString("TemplateName");String strHigh = getArguments().getString("TemplateHigh");meditTextName = (EditText) view.findViewById(R.id.editTextName);meditTextHigh = (EditText) view.findViewById(R.id.editTextHigh);meditTextName.setText(strName);meditTextHigh.setText(strHigh);}// onAttach是關聯activity的,用介面回調@Overridepublic void onAttach(Activity activity) {super.onAttach(activity);try {mOnListener = (onTestListener) activity;} catch (ClassCastException e) {dismiss();}}}
繼承DialogFragment,還有很多方法以及生命週期。自已寫的可以多去查看方法。這上面寫主要是資料傳入,以及資料介面回調到activity。
三、activity的xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity" > <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="80dp" android:gravity="center" android:textSize="18sp" android:text="點擊button" /> <Button android:id="@+id/buttonTest" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /></LinearLayout>
四、dialog對話方塊xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity" > <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="80dp" android:gravity="center" android:textSize="18sp" android:text="點擊button" /> <Button android:id="@+id/buttonTest" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /></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包。
六、如下
到這裡就結束了,歡迎交流學習。
本文代碼下載:請點擊這裡
轉載請註明出處: http://blog.csdn.net/qq_16064871
Android 繼承DialogFragment彈出dialog對話方塊一