当当当当,终于到了Fragment的学习了!
界面的切换使用Activity的话速度会慢一点,同一个app里面使用Fragment进行界面切换方便而且效率,使用Fragment其实和Activity很像,也是和一个布局xml相对应,在Fragment类中onCreateView()
方法中,可以为当前的Fragment绑定布局文件:
//这个方法要返回一个View
View rootView = inflater.inflate(R.layout.fragment_blank, container, false);
...
return rootView;
一些Fragment的操作一般都是通过
getFragmentManager()
.beginTransaction()
...//这里进行一些操作
.commit();
例如,在一个id为container的布局中包含一个名为BlandkFragment的fragment,可以通过add(R.id.container, new BlankFragment())
来做,但是,在Fragment类中,有一段注释值得注意
* Activities that contain this fragment must implement the
* {@link BlankFragment.OnFragmentInteractionListener} interface
* to handle interaction events.
如果要在Activity里面包含Fragment,似乎是要实现这个Fragment的OnFragmentInteractionListener
否则会报错
在一个fragment里面进行一些操作的话,同样是在onCreateView()
中做,就好像是在Activity的onCreate()
方法里做一些操作一样,同样可以用findViewById()
来获取当前Fragment布局中的一些控件,给按钮绑定事件、获取文本框内容之类的。
视频中有一个从Fragment1跳到Fragment2的操作,如果在Fragment1中有addToBackStack(null)
操作的话,回退键可以返回Fragment1,但是自己试的时候没效果,查了一下
FragmentTransaction addToBackStack 无效问题
自己把Activity的父类改为android.app.Activity
,后退操作就可以实现了。
as可以自动创建带滑动标签的activity,利用了fragment和viewpager,需要三个类,
其中public class SectionsPagerAdapter extends FragmentPagerAdapter
,看一下这个类的源码,
/**
* Return the Fragment associated with a specified position.
*/
public abstract Fragment getItem(int position);
/**
* Return a unique identifier for the item at the given position.
*
* <p>The default implementation returns the given position.
* Subclasses should override this method if the positions of items can change.</p>
*
* @param position Position within this adapter
* @return Unique identifier for the item at position
*/
public long getItemId(int position) {
return position;
}
在SectionsPagerAdapter中通过这个方法,返回不同的fragment实例
@Override
public Fragment getItem(int position) {
// getItem is called to instantiate the fragment for the given page.
// Return a PlaceholderFragment (defined as a static inner class below).
return PlaceholderFragment.newInstance(position + 1);
}
通过下面这个方法指定显式的tab页数
@Override
public int getCount() {
// Show 3 total pages.
return 3;
}
在main布局中指定一个ViewPager,id为container,
mViewPager = (ViewPager) findViewById(R.id.container);
mViewPager.setAdapter(mSectionsPagerAdapter);
为ViewPager设置Adapter,这里的每一个都使用的是同一种fragment布局样式,也可以自己定义fragment,让 每个fragment使用不同的fragment。
例如我想让第二个tab用我自己定义的ImageFragment,那么我只要修改SectionsPagerAdapter
@Override
public Fragment getItem(int position) {
// getItem is called to instantiate the fragment for the given page.
// Return a PlaceholderFragment (defined as a static inner class below).
//如果position为1,即第二个页面,那么让它返回自定义的ImageFragment
if(position==1){
return new ImageFragment();
}
return PlaceholderFragment.newInstance(position + 1);
}