概要:
fragment可以看作是一个子acitity,它具有自己的生命周期,与输入事件
可以在不同的activity里复用,是activity模块化的一部分 可重用,模块化的UI组件
创建:
必须重写的回调方法 onCreateView(), 用来定义布局
示例:
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.ViewGroup;
public class ArticleFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.article_view, container, false);
}
}
添加
添加fragment到一个activity中有两种方法,一种是静态添加的,一种是动态的
静态添加
就是通过xml文件添加到布局中,但是这样无法对fragment进行操作
动态添加
FragmentManager 类在 Activity 运行时 对 Fragment 进行添加,移除,替换
FragmentManager => (beginTransation()) 创建一个FargmentTransation => (add()) 添加一个Fragment
Tips:
- 我们需要设置一个空的View作为fragment的容器,如下:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
- 我们通过FragmentTransation进行多级事务后,要 通过
commits()
提交
//以下代码要写在 A次vity 的 onCreated() 方法里
// Create a new Fragment to be placed in the activity layout
HeadlinesFragment firstFragment = new HeadlinesFragment();
// In case this activity was started with special instructions from an
// Intent, pass the Intent's extras to the fragment as arguments
firstFragment.setArguments(getIntent().getExtras());
// Add the fragment to the 'fragment_container' FrameLayout
getSupportFragmentManager().beginTransaction()
.add(R.id.fragment_container, firstFragment).commit(); //最后commit()
replace()只要将add()替换就可以完成了。
注意:移除和替换后,我们要让用户可以向前撤销这次操作,那么在commit前,就必须调用 addToBackStack() 方法
Fragment之间的交互
Fragment之间是不应该交互的,但是可以通过宿主activity来进行间接的交互
那么Fragment和activity之间如何交互呢?
第一种情况:Fragment到Activity
大概流程:
- 在fragment里定义一个接口 A
- 在acivity中实现这个接口,(implent A)
- 在fragment的onAttach()方法中获取接口的方法,然后调用接口方法来和activity交互
这个过程还是看代码回更加清晰一些:
//在fragment中定义接口
public class HeadlinesFragment extends ListFragment {
OnHeadlineSelectedListener mCallback;
// Container Activity must implement this interface
public interface OnHeadlineSelectedListener {
public void onArticleSelected(int position);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
try {
mCallback = (OnHeadlineSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnHeadlineSelectedListener");
}
}
...
}
之后fragment中任何地方都可以使用 mCallback.onArticleSelected(position)来调用activity中实现的此方法
当然activity中怎么实现就随意了