Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 高級編程--Fragment理解與使用

Android 高級編程--Fragment理解與使用

編輯:關於Android編程

Fragment 介紹:

每個Fragment都是一個獨立的模塊,並與它所綁定的Activity精密聯系在一起,不同的Actiivty也可以使用同一個Fragment,在API11之前要使用Fragment,就借助 android.support.v4 包,這樣做能夠更加兼容低版本的手機,並且這時候你的Activity不再是繼承Activity,而是FragmentActivity,如下:
public class FirstActivity extends FragmentActivity

如果是在API11及以上使用的,就直接使用 android.app 包就好了。但是兩種類型的包不能混合使用,只能使用其中的一種,所以當使用 Ctrl+Shift+O import 包的時候,一定要選對包名,否則使用過程中就會報錯。 廢話不多說,接下來主要側重Fragment的使用。

Fragment 創建:

Fragment的創建是通過繼承Fragment類來新建一個新的Fragment,如下:
package com.example.fragmentcommuciation;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class RightFragment extends Fragment {

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		return inflater.inflate(R.layout.rightfragment, container, false);
	}
}

新建一個名為 RightFragment 並繼承Fragment的類,復寫 onCreateView方法,並返回 inflater,它的inflate參數有3個,意思就是把一個id為 R.layout.rightfragment 的fragment的布局添加到一個容器中,第三個參數表示我們不把它attach到rooot parameter中。 上述這個Fragment我們賦給它一個UI,該UI 的xml文件也就是我們上述的rightfragment,新建rightfragment.xml文件,代碼如下:
 
 
   
     
   

這樣就完成了一個附帶UI的Fragment建立過程,比較簡單。後面再說說沒有UI的Fragment,主要用於後台行為。

Fragment 的生命周期:

這個也許他要了解一下,這裡主要說Fragment特有的部分生命周期,附上一張生命周期圖:
vc+88rWloaPU2tK7uPZBY3Rpdml0ebXEsry+1s7EvP7W0Mq508NmcmFnbWVudLHqx6m2qNLlvLS/yaOsyOfPwqO6CjxwcmUgY2xhc3M9"brush:java;">
其中,name就是你新建的那個Fragment的名字,然後運行程序,上面新建的Fragment的UI就會顯示在Activity中,使用起來非常簡單。
接下來說動態,也就是運行時動態改變布局,這種方法更加常用。 當要動態添加Fragment時,主Activity的布局文件中就不是用fragment標簽定義了,而是用FrameLayout,定義一個沒有內容的布局容器,然後我們再java代碼中動態對該容器進行Fragment的add,remove,replace操作,布局代碼如下:
    <frameLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" >
    </frameLayout>

這裡定義了一個id為content的布局,下面我們在java帶按摩中添加Fragment。 在Activity中通過Java 帶代碼操作Fragment是通過FragmentTransaction來實現的,不過首先我們要先獲取FragmentManager,在onCreate方法中實現代碼如下:
FragmentManager fragmentManager;
fragmentManager = getFragmentManager();
messageFragment = new MessageFragment();
fragmentManager.beginTransaction().add(R.id.content, messageFragment).commit();

首先定義 FragmentManager,並調用getFragmentManager()方法,在fragmentManager對象中將要添加的Fragment對象添加到我們之前定義的Activity布局文件中定義的那個id為content的布局容器中即可。 可以通過FragmentManager同時對fragment進行多次操作,只需在最後一次性commit即可,如下:
fragmentManager = getFragmentManager();
messageFragment = new MessageFragment();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();;
fragmentTransaction.add(R.id.content, messageFragment);
fragmentTransaction.add(R.id.content, settingFragment);
fragmentTransaction.commit();

同時,如果我們想要切換當前布局容器中的Fragment,可以有兩種方法: 1、先把當前的fragment hide起來,然後將要顯示的fragment show起來就行 2、直接調用replace方法替換當前成容器中的fragment 使用方法比較簡單,如下: 方法1:可以不用容器
transaction.hide(messageFragment);
transaction.show(contactsFragment);
transaction.commit();

方法2:要制定使用的是哪個容器,這裡是R.id.content
transaction.replace(R.id.content, settingFragment);
transaction.commit();

使用FragmentManager 查找 Fragment:

有時候我們需要在Activity中查找到我們定義在XML布局文件中的fragment,這是後就可以使用FragmentManager來查找。 通常情況下,我們可以通過findFragmentById這個方法找到我們在xml文件中定義的fragment,如下,我們依舊定義一個包含id為fragment1 的fragment:
 

在java文件中就可以通過如下方法找到:
MessageFragment fragment = (MessageFragment)fragmentManager.findFragmentById(R.id.fragment1);

前面我們說到有的fragment可能本身並沒有定義UI,只是執行一些後台服務,要和這樣的fragment進行交互,就必須通過findFragmentByTag方法查找得到,因為這樣的Fragment並不是Activity View層次的一部分,它沒有必要一個資源標識符或者是容器資源標識符,必須在xml文件中為該fragment文件添加 Tag,才可以在Java文件中通過這個Tag找到它,如下:
xml文件:
 

Java代碼:
MessageFragment fragment = (MessageFragment)fragmentManager.findFragmentByTag("tagfragment");

Fragment 和 Back棧:

Fragment 可以動態創建布局,這些布局可以Activity 的UI發生重大的改變,在這些UI改變的時,有時候我們可能會想直接按下 Back 按鍵就可以回到上個Fragment所呈現的布局,就像Activity棧一樣,我們按下Back按鍵就可以退回到上一個Activity,也可以回到上一個Activity的接面。 Fragment也可以執行這種功能,只要我們在 transaction 的commit方法之前調用它的 addToBackStack 方法,將FragmentTransaction添加到back棧中即可實現。代碼如下:
transaction.replace(R.id.content, settingFragment);
transaction.addToBackStack(null);
transaction.commit();


此時按下 Back 按鍵就可以退回到relpace 之前的那個Fragment界面,如果沒有調用addToBackStack方法,替換之後之前那個被替換的fragment就被銷毀了,調用addToBackStack則是將要被替換的fragment stop,在需要的時候在重新resume。
如果你在調用 commit 方法之前執行了多次transaction 的add 或remove 操作,在調用addToBackStack方法時,這些操作都會被當做一次 transaction 添加到Back 棧中,在需要的時候一次性彈出來。如果你在同一個容器中多次添加fragment,那麼你添加他們的前後順序將會決定他們在View層次中出現的順序。

Fragment 切換中加入動畫:

上述講了兩種Fragment的切換方法,一種是先hide然後show,另一種是直接replace。在fragment的切換過程中可能會顯得比較突兀,這是後如果加上動畫來進行過度的話就會顯得界面切換比較流暢。加入動畫的使用方法如下:
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setTransition(android.support.v4.app.FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
transaction.replace(R.id.content, messageFragment);
transaction.commit();


除了上述這種直接調用系統動畫的方法,我們還可以通過setCustomAnimations方法自定義切換動畫,這裡還沒實現,就不貼出來了。

Fragment 與 Activity 之間的通信:

任何Fragment都可以通過getActivity()方法來訪問它所嵌入的Activity中的引用,比如某一個View,使用方法如下:
TextView textView = (TextView)getActivity().findViewById(R.id.contacts_text);

而當Fragment 要與 Activity 之間共享事件,比如某些按鈕按下等OnClick事件的時候,就需要在Fragment中定義一個回調接口,並在Activity中實現這個接口。
比如我們在一個 Fragment 中定義了幾個按鈕,然後再定義接口如下:
/** Activity要實現這個接口,這樣Fragment和Activity就可以共享事件觸發的資源了 */
	public interface MyListener {
		public void showMessage(int index);

然後我們可以直接在這個Fragment 中使用這個接口,如下:
/** 按鈕的監聽器 */
class MyButtonClickListener implements OnClickListener {
	public void onClick(View v) {
		Button button = (Button) v;
		if (button == firstButton)
			myListener.showMessage(1);
		if (button == secondButton)
			myListener.showMessage(2);
		if (button == thirdButton)
			myListener.showMessage(3);
		}
	}

而這個接口的實現就寫在Activity中就可以了,代碼如下:
public void showMessage(int index) {
	if (1 == index)
		showMessageView.setText("firstButton onClick");
	if (2 == index)
		showMessageView.setText("secondButton onClick");
	if (3 == index)
		showMessageView.setText("thirdButton onClick");
	}

這樣之後,我們再Fragment中按下它所定義的按鈕的時候,就會通過這個回調接口傳送到Activity中處理,實現了Fragment與Activity之間的通信。
通信效果如下圖:
\

Fragment之間的切換效果如下圖,在郭神的代碼框架上修改,並加上了切換動畫和Back棧



  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved