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相绑定,它也不再拥有视图层次结构,它的所有资源都将被释放。