Android Fragment 笔记

来源:互联网 发布:帕克生涯数据 编辑:程序博客网 时间:2024/06/06 03:04

1 定义Fragment:

1 继承Fragment

package com.example.testproject;import android.app.Fragment;public class MyFragment extends Fragment {}

2 继承V4包里的Fragment

package com.example.testproject;import android.support.v4.app.Fragment;public class MyFragment extends Fragment {}

两个方法大同小异,无非是APIlevel的问题,如果需要兼容4.0以下的机器,就需要继承自V4包。

2 Fragment的布局和操作

fragment实现自己的布局,要重写onCreateView这个函数

private int layoutRes; //和activity一样的布局文件private View parentView; //通过这个parentView来管理layout文件中声明的控件@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,        Bundle savedInstanceState) {    parentView = inflater.inflate(layoutRes, container, false);    return parentView;}

activity有finish()方法结束掉自己,fragment中也有类似的方法:

getActivity().getSupportFragmentManager().popBackStack();//popStack操作也就是弹栈,即模拟返回键的操作

3 加载Fragment:

1 静态加载

在布局文件中当成自定义控件一样声明

<RelativeLayout 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"    tools:context=".MainActivity" >    <com.example.testproject.MyFragment        android:id="@+id/mFragment"        android:layout_width="match_parent"        android:layout_height="match_parent"        ></com.example.testproject.MyFragment></RelativeLayout>

在activity中获取这个fragment:

MyFragment myFragment = (MyFragment)getFragmentManager().findFragmentById(R.id.mFragment);

如果是使用V4包,则activity要继承自FragmentActivity,来获取一些操作Fragment的方法

public class MainActivity extends FragmentActivity

然后再:

MyFragment myFragment = (MyFragment)getSupportFragmentManager().findFragmentById(R.id.mFragment);

2 动态加载

动态加载相对复杂,但是也更加灵活,首先在布局文件里,为fragment的容器添加一个ID:

<RelativeLayout 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:id="@+id/container"    tools:context=".MainActivity" ></RelativeLayout>

再在activity中使用:

// 首先获取manager,这个变量在fragment的设计中应该是一个单例,将它写成全局变量比较方便FragmentManager manager = getFragmentManager();// 开启事务,这个transition不能重复使用,建议作为局部变量FragmentTransaction transaction = manager.beginTransaction();// 第一个参数是布局文件中,fragment容器的ID,第二个参数是Fragment的实例// 这个"MY"可以在fragment.getTag()的方法中获取到,起到标识的作用// add方法的重载有很多,可以把TAG替换成ID// add方法之外还有replace,remove,hide,show等方法。transaction.add(R.id.container, new MyFragment(), "MY");// 提交事务transaction.commit();

如果是V4包,则这样子获取manager

FragmentManager manager = getSupportFragmentManager();

在原来代码的基础上再次添加一个fragment:

// 开启事务,这个transition不能重复使用,建议作为局部变量FragmentTransaction transaction = manager.beginTransaction();// 第一个参数是布局文件中,fragment容器的ID,第二个参数是Fragment的实例// 这个"MY"可以在fragment.getTag()的方法中获取到,起到标识的作用// add方法的重载有很多,可以把TAG替换成ID// add方法之外还有replace,remove,hide,show等方法。transaction.add(R.id.container, new MyFragment(), "SECOND");// 将当前也就是第一个fragment添加到Stack中保存起来,// 在添加第二个fragment之后,按返回键执行popstack操作的时候,会显示第一个fragmenttransaction.addToBackStack(null);// 提交事务,不提交不起作用transaction.commit();

4 在activity中管理Fragment:

fragment在activity中是以stack的形式存放,

这里可以添加一个监听器,当Stack的状态发生变化
(比如添加一个fragment,remove掉一个fragment之类的操作),都会响应CAllBACK函数

public class MainActivity extends Activity implements OnBackStackChangedListenergetSupportFragmentManager().addOnBackStackChangedListener(MainActivity.this);@Overridepublic void onBackStackChanged() {    do something;}

获取Stack中所有fragment

List<Fragment> fragments = manager.getFragments();

根据TAG获取fragment

MyFragment fragmentByTag = (MyFragment) manager.findFragmentByTag("SECOND");

注意:一个Fragment执行popStack操作以后,fragments的size不会变化,这时候如果调用fragmes.get(index)方法,会报空指针错误,所以一定要先判断 fragment != null才能继续操作。

0 0
原创粉丝点击