Android類參考—Fragment(六)

上一篇:/kf/201206/134435.html

public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState)

當一個Fragment對象被作為一個View對象佈局的一部分來填充時,就會調用該方法,通常用於設置一個Activity的內容視窗。在從佈局文件的標簽中創建該Fragment對象之後,可以立即調用該對象。註意:這時的調用是在該Fragment對象的onAttach(Activity)方法被調用之前,因此在這時所能做的所有的事情就是解析並保存它的屬性設置。

每次調用該方法時,該Fragment對象都被填充,即使是把它填充到一個新的用於保存狀態的新的實例。通常每次都要重新解析參數,從而允許它們根據不同的配置來改變。

該方法在API Level 12中被引入。

以下是一個Fragment的典型實現,它能夠同時通過屬性和getArguments()方法來獲取參數:

publicstaticclassMyFragmentextendsFragment{
    CharSequence mLabel;

    /**
     * Create a new instance of MyFragment that will be initialized
     * with the given arguments.
     */
    staticMyFragment newInstance(CharSequence label){
        MyFragment f =newMyFragment();
        Bundle b =newBundle();
        b.putCharSequence("label", label);
        f.setArguments(b);
        return f;
    }

    /**
     * Parse attributes during inflation from a view hierarchy into the
     * arguments we handle.
     */
    @Overridepublicvoid onInflate(Activity activity,AttributeSet attrs,
            Bundle savedInstanceState){
        super.onInflate(activity, attrs, savedInstanceState);

        TypedArray a = activity.obtainStyledAttributes(attrs,
                R.styleable.FragmentArguments);
        mLabel = a.getText(R.styleable.FragmentArguments_android_label);
        a.recycle();
    }

    /**
     * During creation, if arguments have been supplied to the fragment
     * then parse those out.
     */
    @Overridepublicvoid onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        Bundle args = getArguments();
        if(args !=null){
            mLabel = args.getCharSequence("label", mLabel);
        }
    }

    /**
     * Create the view for this fragment, using the arguments given to it.
     */
    @OverridepublicView onCreateView(LayoutInflater inflater,ViewGroup container,
            Bundle savedInstanceState){
        View v = inflater.inflate(R.layout.hello_world, container,false);
        View tv = v.findViewById(R.id.text);
        ((TextView)tv).setText(mLabel !=null? mLabel :"(no label)");
        tv.setBackgroundDrawable(getResources().getDrawable(android.R.drawable.gallery_thumb));
        return v;
    }
}

要註使用意的是,使用styleable資源來解析XML屬性。以下是styleable所使用的XML聲明:

<declare-styleablename="FragmentArguments">
    <attrname="android:label"/>
</declare-styleable>

然後,在Activity的內容佈局內部,能夠像下面這樣聲明一個Fragment標簽:

<fragmentclass="com.example.android.apis.app.FragmentArguments$MyFragment"
        android:id="@+id/embedded"
        android:layout_width="0px"android:layout_height="wrap_content"
        android:layout_weight="1"
        android:label="@string/fragment_arguments_embedded"/>

Fragment對象也能夠在運行時,通過在Bundle對象中參數來動態的創建,以下是一個動態創建Fragment對象的例子:

@Overrideprotectedvoid onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fragment_arguments);

    if(savedInstanceState ==null){
        // First-time init; create fragment to embed in activity.
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        Fragment newFragment =MyFragment.newInstance("From Arguments");
        ft.add(R.id.created, newFragment);
        ft.commit();
    }
}

參數

activity 指定要該Fragment對象來填充的Activity對象;

attrs 指定瞭正在創建的Fragment對象標簽中的屬性;

savedInstanceState 如果該Fragment對要重之前保存的狀態中重建,那麼就要使用該參數,它保存瞭該Fragment對象之前的狀態。

public void onLowMemory()

當整個系統運行在低內存的狀態,並當前活躍的運行進程視圖回收內存的時候,會調用該方法。這個方法被調用的精確的時間點沒有被定義,通常它會發生在所有的後臺進程都被殺死的前後,這是在到達殺死進程托管服務的時點之前,並且會盡量避免殺死前臺UI。

應用程序能夠實現該方法,用於釋放緩存或其他的不需要的資源。在從這個方法返回之後,系統會執行gc(垃圾回收)操作。

public boolean onOptionsItemSelected(MenuItem item)

選項菜單被選擇的時候,系統會調用該方法。該方法的默認實現隻是簡單的返回false,默認實現隻是執行一些正常的處理(如調用菜單項目的Runnable對象,或把一個消息發送給合適的Handler對象)。可以使用菜單項的這個方法,做那些沒有其他措施處理的工作。

該類的任何子類都應該調用基類的實現,以便執行默認的菜單處理。

參數

item 用戶選擇的菜單項。

返回值

佈爾值,返回false,則運行正常的菜單處理繼續執行,否則會終止執行。

 

public void onOptionsMenuClosed(Menu menu)

在選項菜單被關閉的時候(既可以是用戶按下瞭回退或菜單按鈕取消瞭菜單,也可以是用戶選擇瞭一個菜單項),系統會調用這個方法。

參數

menu 最後顯示的或由onCreateOptionsMenu()方法第一次初始化的選項菜單。

Public void onPause()

當該Fragment對象不再是恢復狀態的時候,系統會調用該方法。這個方法通常會跟它的Activity的生命周期的Activity.onPause()方法捆綁。

public void onPrepareOptionsMenu(Menu menu)

該方法用於準備顯示屏幕的標準選項菜單。它是選項菜單顯示之前被調用的。能夠使用這個方法來啟用或禁用某些菜單項,或者動態的修改菜單項的內容。

參數

menu最後顯示的或由onCreateOptionsMenu()方法第一次初始化的選項菜單。

Public void onResume()

當Fragment對象顯示給用戶並處於活躍的運行狀態時,系統會調用這個方法。它通常會跟它的Activity生命周期的Activity.onResume()方法綁定。

public void onSaveInstanceState(Bundle outstate)

當要求Fragment對象保存當前的動態的狀態時,系統會調用該方法,以便能夠在以後的新實例重建時,使用這些被保存的狀態。如果以後需要創建一個新的該Fragment對象實例,那麼放置該方法Bundle參數中的數據,就會傳遞給onCreate(Bundle)、onCreateView(LayoutInflater, ViewGroup, Bundle)、onActivityCreated(Bundle)方法的Bundle參數)。

對應Activity.onSaveInstanceState(Bundle)方法的大多數討論,也適用於本方法。但是要註意的是:這個方法可以在onDestroy()方法之前的任意時點調用。有一些情況是該Fragment對象已經被關閉瞭(如當它放置在沒有UI顯示的回退堆棧中時),但是直到它的Activity需要保存它的狀態時,該Fragment的狀態才會保存。

參數

outstate 該參數用於放置要保存的狀態,它是一個Bundle類型的對象。

 

 

摘自 FireOfStar的專欄

發佈留言