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文件中声明的控件
@Override
public 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操作的时候,会显示第一个fragment
transaction.addToBackStack(null);
// 提交事务,不提交不起作用
transaction.commit();
4 在activity中管理Fragment:
fragment在activity中是以stack的形式存放,
这里可以添加一个监听器,当Stack的状态发生变化
(比如添加一个fragment,remove掉一个fragment之类的操作),都会响应CAllBACK函数
public class MainActivity extends Activity implements OnBackStackChangedListener
getSupportFragmentManager().addOnBackStackChangedListener(MainActivity.this);
@Override
public 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才能继续操作。