Fragment
Fragment是什麼?
- Android在3.0中引入了fragments的概念,主要目的是用在大屏幕設備上–例如平板電腦上,支持更加動態和靈活的UI設計。平板電腦的屏幕要比手機的大得多,有更多的空間來放更多的UI組件,並且這些組件之間會產生更多的交互。Fragment允許這樣的一種設計,而不需要你親自來管理 viewhierarchy的複雜變化。 通過將activity的佈局分散到fragment中, 你可以在運行時修改activity的外觀,並在由activity管理的back stack中保存那些變化.
例如, 一個新聞應用可以在屏幕左側使用一個fragment來展示一個文章的列表,然後在屏幕右側使用另一個fragment來展示一篇文章–2個fragment並排顯示在相同的一個activity中,並且每一個fragment擁有它自己的一套生命週期回調方法,並且處理它們自己的用戶輸入事件。 因此, 取代使用一個activity來選擇一篇文章而另一個activity來閱讀文章的方式,用戶可以在同一個activity中選擇一篇文章並且閱讀。
Fragment靜態加載怎麼用
一、創建Fragment、寫好佈局文件
public class FragmentOne extends Fragment {
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_one, container, false);
return view;
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="fragment_one" />
</LinearLayout>
二、創建Activity
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
三、在Activity佈局文件中:引用Fragment
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<fragment
android:id="@+id/fragment_one"
android:name="com.liu.traindemo.fragment.FragmentOne"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
Fragment動態加載怎麼用
一、先創建一個Fragment
<FrameLayout 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:background="@color/colorPrimary"
tools:context="com.example.myapplication.BlankFragment2">
<!-- TODO: Update blank fragment layout -->
<TextView
android:id="@+id/black_fragment2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.example.myapplication.BlankFragment2"
>
</TextView>
</FrameLayout>
二、新建一個Activity
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
三、在Activity裏新建一個Fragment
blankFragment=new BlankFragment();
四、實例化一個fragmentManager
fragmentManager=getFragmentManager();
五、開啓一個事務
fragmentTransaction=fragmentManager.beginTransaction();
六、添加fragment
fragmentTransaction.replace(R.id.L_bt,blankFragment2);
七、提交事務
fragmentTransaction.commit();
八、一般都需要添加判斷,完整代碼以下展示
public void onClick(View view){
fragmentTransaction=fragmentManager.beginTransaction();
switch (view.getId()){
case R.id.bt_red:
if (blankFragment==null){
blankFragment=new BlankFragment();
}
fragmentTransaction.replace(R.id.L_bt,blankFragment);
break;
case R.id.bt_blue:
if (blankFragment2==null){
blankFragment2=new BlankFragment2();
}
fragmentTransaction.replace(R.id.L_bt,blankFragment2);
break;
case R.id.bt_yellow:
if (yellowFragment==null){
yellowFragment=new YellowFragment();
}
fragmentTransaction.replace(R.id.L_bt,yellowFragment);
default:
break;
}
}
ViewPager+Fragment實現頁面滑動
一、先創建一個Activity,添加ViewPager
<android.support.v4.view.ViewPager
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/vw_yd"
>
</android.support.v4.view.ViewPager>
二、創建數個Fragment,並添加顏色,以便實驗時容易區分(此處便放其中一個)
<FrameLayout 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:background="@color/black"
tools:context="com.example.zwzz.myapplication.test.BlankFragment">
<!-- TODO: Update blank fragment layout -->
</FrameLayout>
三、創建適配器
public class Adapter extends FragmentPagerAdapter {
List<Fragment>fragmentList;
public Adapter(FragmentManager fm,List<Fragment>fragmentList) {
super(fm);
this.fragmentList=fragmentList;
}
@Override
public Fragment getItem(int position) {
return fragmentList.get(position);
}
@Override
public int getCount() {
return fragmentList.size();
}
}
四、最終操作,請看以下代碼
List<Fragment> fragmentList=new ArrayList<>();
private ViewPager viewPager;
private BlankFragment blankFragment;
private WhiteFragment whiteFragment;
GreenFragment greenFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main5);
viewPager=findViewById(R.id.vw_yd);
greenFragment=new GreenFragment();
blankFragment=new BlankFragment();
whiteFragment=new WhiteFragment();
fragmentList.add(greenFragment);
fragmentList.add(blankFragment);
fragmentList.add(whiteFragment);
Adapter adapter=new Adapter(getSupportFragmentManager(),fragmentList);
viewPager.setAdapter(adapter);
Fragment生命週期
如圖一,是Fragment的生命週期;圖二,是Activity與Fragment生命週期的對比圖;
- onStart:當到OnStart()時,Fragment對用戶就是可見的了。但用戶還未開始與Fragment交互。在生命週期中也可以看到Fragment的OnStart()過程與Activity的OnStart()過程是綁定的。意義即是一樣的。以前你寫在Activity的OnStart()中來處理的代碼,用Fragment來實現時,依然可以放在OnStart()中來處理。
- onResume:當這個fragment對用戶可見並且正在運行時調用。這是Fragment與用戶交互之前的最後一個回調。從生命週期對比中,可以看到,Fragment的OnResume與Activity的OnResume是相互綁定的,意義是一樣的。它依賴於包含它的activity的Activity.onResume。當OnResume()結束後,就可以正式與用戶交互了。
- onPause:此回調與Activity的OnPause()相綁定,與Activity的OnPause()意義一樣。
- onStop:這個回調與Activity的OnStop()相綁定,意義一樣。已停止的Fragment可以直接返回到OnStart()回調,然後調用- OnResume()。
- onDestroyView:如果Fragment即將被結束或保存,那麼撤銷方向上的下一個回調將是onDestoryView()。會將在onCreateView創建的視圖與這個fragment分離。下次這個fragment若要顯示,那麼將會創建新視圖。這會在onStop之後和onDestroy之前調用。這個方法的調用同onCreateView是否返回非null視圖無關。它會潛在的在這個視圖狀態被保存之後以及它被它的父視圖回收之前調用。
- onDestroy:當這個fragment不再使用時調用。需要注意的是,它即使經過了onDestroy()階段,但仍然能從Activity中找到,因爲它還沒有Detach。
- onDetach:Fragment生命週期中最後一個回調是onDetach()。調用它以後,Fragment就不再與Activity相綁定,它也不再擁有視圖層次結構,它的所有資源都將被釋放。