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的方式找到也可以。