2014年7月14日 星期一

了解 FragmentManager / DialogFragment

FragmentManager
要管理fragment们,需使用FragmentManager
要获取它,需在activity中调用方法getFragmentManager()
你可以用findFragmentById()findFragmentByTag(),获取activity中已存在的fragment们。

執行Fragment 的事務

activity 中使用fragment 的一個偉大的好處是
跟據用戶的輸入對fragment 進行添加、刪除、替換以及執行其它動作的能力
你提交的一組fragment 的變化叫做一個事務。事務通過FragmentTransaction 來執行
你可以通過FragmentManager 來取得FragmentTransaction 的實例,如下:
FragmentManager fragmentManager getFragmentManager () ; 
FragmentTransaction fragmentTransaction fragmentManager beginTransaction () ;
一個事務是在同一時刻執行的一組動作(很像數據庫中的事務)。
你可以用add(),remove(),replace() 等方法構成事務,最後使用commit() 方法提交事務

Fragment子類別之DialogFragment

infor from : http://cheng-min-i-taiwan.blogspot.tw/2013/02/fragmentdialogfragment.html

在Fragment子類別中包括了 ListFragment 、DialogFragment、PreferenceFragment 及 WebViewFragment。

DialogFragment是一個浮動在Activity上對話框形的Fragment,它有著類似Dialog(對話框)同樣的功能,經常使用在與使用者互動的畫面上;例如輸入帳號密碼、問題訊問回答、...等詳見Dialogs官方網頁說明。

另外,在另一個Dialogs官網上有建議AlertDialog(告警、詢問)、DatePickerDialog (年、月、日)及 TimePickerDialog(時間)等對話框(Dialog)建議改採
繼承 DialogFragment 方式完成。


實作環境:
Win 7 Sp1
Java version 1.6.0_35
Eclipse 3.7.2
ADT 20.0.1
ASUS Nexus 7 平板 (4.1.2)
HTC Sensation 手機 (4.0.3)

步驟:
1. 用Eclipse建立一個Android 3.x項目以上專案並命名為DialogFragmentExample

2. 在 res/layout中加入一個XML檔案並且將其命名為fragment1.xml,內容如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

</LinearLayout>

3. main.xml內容如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

</LinearLayout>

4. 在src/ package目錄下增加 Fragment1.java,內容如下:

package net.learn2develop.DialogFragmentExample;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;

public class Fragment1 extends DialogFragment {

 
//newInstance()方法和new關鍵字除了一個是方法,一個是關鍵字外,最主要有什麽區別?它們的區別在于創建對象的方式不一樣,前者是使用類加載機制,後者是創建一個新類//

    static Fragment1 newInstance(String title) { 
        Fragment1 fragment = new Fragment1();
        Bundle args = new Bundle();
        args.putString("title", title);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        String title = getArguments().getString("title");
        return new AlertDialog.Builder(getActivity()).setIcon(R.drawable.icon).setTitle(title)
                .setPositiveButton("是", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        ((MainActivity) getActivity()).doPositiveClick();
                    }
                }).setNegativeButton("不", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        ((MainActivity) getActivity()).doNegativeClick();
                    }
                }).create();
    }
}

5. MainActivity內容如下:

package net.learn2develop.DialogFragmentExample;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Fragment1 dialogFragment = Fragment1.newInstance("您是南開數創系的學生嗎?");
        dialogFragment.show(getFragmentManager(), "dialog");

    }

    public void doPositiveClick() {
        // ---perform steps when user clicks on OK---
        Log.i("DialogFragmentExample", "是,我是南開數創系的學生!!");
    }

    public void doNegativeClick() {
        // ---perform steps when user clicks on Cancel---
        Log.i("DialogFragmentExample ", "不,我不是南開數創系的學生!!");
    }
}

6. AndroidManifest.xml保持預設。


執行結果:
程式執行時會出現一個詢問對話框,當回答是/否後觀察DDMS上的Log會有不同的紀錄。

沒有留言:

張貼留言