引用一张图
Fragment为Activity提供了多窗口的交互体验,一般应用的主界面都是采用,Activity+Fragment实现的。
建立一个Fragment的时候我们一般继承的是android.support.v4.app.Fragment得Fragment,
public class MainFragment extends Fragment {
}
这样可以兼容低版本。
Fragment的生命周期基本和Activity相同,唯一的区别是我们必须重写onCreateView方法来定义当前Fragment的布局。
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);
}
}
LayoutInflater 是一个抽象类,我理解的就是一个布局加载器,加载xml为view.加载的方法就是调用。
public View inflate (int resource, ViewGroup root)
public View inflate (XmlPullParser parser, ViewGroup root)
public View inflate (XmlPullParser parser, ViewGroup root, boolean attachToRoot)
public View inflate (int resource, ViewGroup root, boolean attachToRoot)
可以看看鸿洋大神的文章:http://blog.csdn.net/lmj623565791/article/details/38171465
inflater.inflate三个参数,第一个是资源文件xml,第二个是父ViewGroup,第三个参数是否返回父Group.
Fragment的生命周期是和Activity一一对应的。为了适应大屏幕,我们可以写不同的Fragment,放在不同的layout下(如:layout-larg),这样大屏幕和小屏幕可以加载不同的布局,
可以参考前面写的Android梳理 屏幕适配。
现在说说怎么样把Fragment加入到Activity中.为了兼容低版本,Activity继承FragmentActivity, 如果不需要兼容可以直接用Activity.
1.Activity的xml文件直接包名加fragment
2.采用动态添加
Android提供了一个FragmentTransaction来对Fragment进行添加、删除、替换的操作。
运用fragment(尤其是那些在运行时添加的)的一个很重要的规则就是在布局中必须有一个容器View,fragment的layout将会放在这个view里面。
我们在Activity的xml中建一个FrameLayout做容器View,
要得到FragmentTransaction,可以用FragmentManager来创建
// 创建Fragment实例
ArticleFragment newFragment = new ArticleFragment();
Bundle args = new Bundle();
args.putInt(ArticleFragment.ARG_POSITION, position);
//设置参数
newFragment.setArguments(args);
//获得FragmentTransaction
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.add(R.id.fragment_container, newFragment);
//提交
transaction.commit();
替换Fragment
// 创建Fragment实例
ArticleFragment newFragment = new ArticleFragment();
Bundle args = new Bundle();
args.putInt(ArticleFragment.ARG_POSITION, position);
//设置参数
newFragment.setArguments(args);
//获得FragmentTransaction
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, newFragment);
//为了让用户向后导航fragment事务,我们必须在FragmentTransaction提交前调用addToBackStack()方法
transaction.addToBackStack(null);
//提交
transaction.commit();
当移除或者替换一个fragment并把它放入返回栈中时,被移除的fragment的生命周期是stopped(不是destoryed).当用户返回重新恢复这个fragment,它的生命周期是restarts。如果没有把fragment放入返回栈中,那么当它被移除或者替换时,其生命周期是destoryed。
对于Activity和Fragment的交互
1、activity向Fragment传递
前面的代码有一个有一个传参操作了
newFragment.setArguments(args)
,fragment取值用getArguments,除了这样,我们还可以在Activity直接调用Fragment的方法。
ArticleFragment articleFrag = (ArticleFragment) getSupportFragmentManager().findFragmentById(R.id.article_fragment);得到要调用方法的Fragment.
articleFrag.update();调用方法
2.Fragment向Activity传递
需要在Fragment定义接口,Activity实现接口。。Fragment在他们生命周期的onAttach()方法中获取接口的实现,然后调用接口的方法来与Activity交互。
package com.example.android.fragments;
import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class HeadlinesFragment extends ListFragment {
OnHeadlineSelectedListener mCallback;
// The container Activity must implement this interface so the frag can deliver messages
public interface OnHeadlineSelectedListener {
/** Called by HeadlinesFragment when a list item is selected */
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");
}
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
// 接口回调
mCallback.onArticleSelected(position);
}
}
public static class MainActivity extends Activity
implements HeadlinesFragment.OnHeadlineSelectedListener{
...
public void onArticleSelected(int position) {
// The user selected the headline of an article from the HeadlinesFragment
// Do something here to display that article
}
}