Fragment系列—Activity中添加fragment

Fragment的定義和解釋這裏就不說了,面試的時候也是經常問的到,官方的文檔中是推薦和ViewPager一起使用,後期會繼續介紹使用方法,但是我們也可以單獨使用,會遇到一些小細節問題,如果不加註意會報錯的。

1、XML佈局文件中添加Fragment。每個Fragment其實類似與一個小型的Activity,所以有它對呀的java類。

public class Example extends Fragment{
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		return inflater.inflate(R.layout.page1, null);
	}
}

R.layout.page1對應的佈局頁面:

<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="horizontal" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="這是一個Fragment" />
    
    <Button 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="this is an Button"/>

</LinearLayout>

在需要添加fragment的XML佈局中添加fragment

<fragment 
        android:name="com.example.zfragment.Example"
        android:id="@+id/fragment1"
        android:layout_width="100dp"
        android:layout_height="50dp"/>

這樣就OK了,沒多大的技術含量,一般使用在固定的佈局文件中比較多。

2、利用代碼添加,實現可動態的修改替換等,page1.xml和example.java內容都不變,變化的是不需要再XML佈局中添加fragment,通過代碼實現:

public class MainActivity extends Activity {
	
	FragmentManager manager;
	FragmentTransaction transaction;
	Fragment fragment1;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		manager = getFragmentManager();
		transaction = manager.beginTransaction();
		fragment1 = (Fragment)new Example();
		transaction.add(R.id.ct, fragment1, "one");
		transaction.commit();
	}
}
實現效果和第一種方法一樣。

需要注意的問題如下:

1、在example.java 文件中,我們需要導包,第一個是import android.support.v4.app.Fragment,這個包是個補丁包,是爲了照顧低版本而導入的包,如果使用了這個包,那麼就不能採取第一種方法XML佈局文件的方式了,運行會報不正確的fragment錯誤,因爲無法識別<fragment>這個標籤,切記。這個問題不大,但是不注意還是會造成干擾,可惡!所以換成import android.app.Fragment;編譯運行一切正常了。

2、在主Activity中,看到有時候會繼承FragmentActivity,也可以繼承Activity,有什麼區別呢?其實都一樣,原理同上,所以如果你的版本高於3.0,直接使用Activity得了,省事方便。

3、transaction.add(R.id.ct, fragment1, "one")這個方法參數的說明:第一個是容器ID,很簡單就可以理解,我們這個fragment添加到哪個位置呢?總得要給個地址吧,所以這個ID既可以是整個Activity的XML佈局文件,也可以是XML中的某部分,例如左邊右邊等,都可以通過指定ViewID的方式指定位置。第二個好理解,就是fragment了,第三個就是一個TAG,這個也很重要,我們後期可以通過findViewByTag()的方式,找到這個fragment,從而實現刪除替換等操作,相當於取了名字,如果要靈活變換fragment,這個很重要。當然也可以通過fragment佈局中指定ID的方式找到也可以。

發佈了61 篇原創文章 · 獲贊 10 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章