Android Fragment应用(一)
原博文:http://blog.csdn.net/lmj623565791/article/details/37992017
1.Fragment(碎片)类
Fragment类似一个嵌套Activity,可以定义自己的layout和自己的生命周期。
多个Fragment可以放在一个Activity中(所以上面讲到类似一个嵌套Activity),
而这个类可以对这些Fragment进行配置以适应不同的屏幕尺寸(比如平板和手机)
注意:Fragment是在3.0版本引入的,如果你使用的是3.0之前的系统,需要先导入android-support-v4的jar包才能使用Fragment功能。
2.生命周期(方法)
新方法,这里需要重点介绍一下:
- onAttach方法:Fragment和Activity建立关联的时候调用。
- onCreateView方法:为Fragment加载布局时调用。
- onActivityCreated方法:当Activity中的onCreate方法执行完后调用。
- onDestroyView方法:Fragment中的布局被移除时调用。
- onDetach方法:Fragment和Activity解除关联的时候调用。
3.定义Fragment类 :Tag为自己定义,用来标识该Fragment,方便找到它的示例
public class Fragment1 extends Fragment { public static final String Tag=Fragment1.class.getSimpleName(); @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //创建自己的用户界面,为该fragment指定布局文件“R.layout.fragment1” return inflater.inflate(R.layout.fragment1,container,false); }
4.使用Fragment指定的界面布局
4.1在布局文件(activity_main.xml)上直接使用(较死板)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android:name="com.example.news.Fragment1" android:id="@+id/list" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" /> <fragment android:name="com.example.news.Fragment2" android:id="@+id/viewer" android:layout_weight="2" android:layout_width="0dp" android:layout_height="match_parent" /> </LinearLayout>
4.2在MainActivity.class中动态加载Fragment
public class MainActivity extends ActionBarActivity { private Fragment2 fragment2=new Fragment2(); private Fragment1 fragment1=new Fragment1(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.linearlayout); //判读屏幕是否为横屏、竖屏,变换不同的界面 if(getResources().getConfiguration().orientation== Configuration.ORIENTATION_LANDSCAPE) { //横屏时:添加fragment2 //步骤: /* * 1.获取fragment管理器:FragmentManager * 2.获取开始任务:beginTransaction * 3.任务操作:add,replace,show,hide等等 * 4.提交任务:commit(); * */ getFragmentManager().beginTransaction().add(android.R.id.content, fragment2).commit(); }else{ //竖屏时:添加fragment1 getFragmentManager().beginTransaction().add(android.R.id.content, fragment1).commit(); // getFragmentManager().beginTransaction().replace() } }}
5.与activity间的交流
5.1 Activity与Fragment交流
a、如果你Activity中包含自己管理的Fragment的引用,可以通过引用直接访问所有的Fragment的public方法
b、如果Activity中未保存任何Fragment的引用,那么没关系,每个Fragment都有一个唯一的TAG或者ID,
可以通过getFragmentManager.findFragmentByTag()或者findFragmentById()获得任何Fragment实例,然后进行操作。
c、在Fragment中可以通过getActivity得到当前绑定的Activity的实例,然后进行操作。
注:如果在Fragment中需要Context,可以通过调用getActivity(),如果该Context需要在Activity被销毁后还存在,则使用getActivity().getApplicationContext()。
findFragmentById()示例:R.id.fragment和getId()的值是指xml文件里添加的id:fragment1的值
Fragment1 fragment=(Fragment1)getFragmentManager().findFragmentById(R.id.fragment1); Fragment1 fragment=(Fragment1)getFragmentManager().findFragmentByTag(Fragment1.Tag); String Tag=fragment.getId();
<fragment android:name="com.example.hq.fragments.Fragment1" android:id="@+id/fragment1" android:layout_width="match_parent" android:layout_height="match_parent"></fragment>
findFragmentByTag()示例:Fragment1.Tag已经在该类里定义了而且要在add方法中添加进去才能findByTag
//动态添加fragment1 getFragmentManager().beginTransaction().add(R.id.linear,fragment1,Fragment1.Tag).commit()
根据在Fragmen1类里定义的Tag,获取该它的示例
//获取fragment1 Fragment1 fragment=(Fragment1)getFragmentManager().findFragmentByTag(Fragment1.Tag); String Tag=fragment.getTag()+":";
遗留的地方:任务操作:add,replace,show,hide等等
a、比如:我在FragmentA中的EditText填了一些数据,当切换到FragmentB时,如果希望会到A还能看到数据,则适合你的就是hide和show;也就是说,希望保留用户操作的面板,你可以使用hide和show,当然了不要使劲在那new实例,进行下非null判断。
b、再比如:我不希望保留用户操作,你可以使用remove(),然后add();或者使用replace()这个和remove,add是相同的效果。
c、remove和detach有一点细微的区别,在不考虑回退栈的情况下,remove会销毁整个Fragment实例,而detach则只是销毁其视图结构,实例并不会被销毁。那么二者怎么取舍使用呢?如果你的当前Activity一直存在,那么在不希望保留用户操作的时候,你可以优先使用detach。