Fragment和Activity的生命周期方法类似,只是Fragment比Activity多了几个方法而已,如:
// onAttach方法:Fragment和Activity建立关联的时候调用*/
1.onAttach(Activity activity)
//onCreateView方法:为Fragment加载布局时调用
2.onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState
// Fragment中的布局被移除时调用
3.onDestroyView()
Fragment是sdk 3.0出现的,主要原因是适应大屏,如平板。
//下面的demo主要讲了如何实现Fragment和Fragment之间的通信,Fragment之间并不能直接通信,Activity是
是Fragment之间通信的桥梁。下面是一个简单的例子。
本Demo为适应小屏和大屏(平板),有连个主要布局,通过代码可看出。
news_articles.xml ( 用于大屏(平板))
<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.android.fragments.HeadlinesFragment"
android:id="@+id/headlines_fragment"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" />
<fragment android:name="com.example.android.fragments.ArticleFragment"
android:id="@+id/article_fragment"
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="match_parent" />
</LinearLayout>
news_articles.xml ( 用于小屏)
<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" />
//列表 HeadlinesFragment .java
public class HeadlinesFragment extends ListFragment {
OnHeadlineSelectedListener mCallback;
public interface OnHeadlineSelectedListener {
public void onArticleSelected(int position);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i("HONEYCOMB-------------->", Build.VERSION_CODES.HONEYCOMB+"");//3.0
Log.i("SDK_INT---------------->", Build.VERSION.SDK_INT+"");//4.2.2
//判断当前的sdk版本,如果本设备版本大于3.0则用新的API
int layout = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ?
android.R.layout.simple_list_item_activated_1 : android.R.layout.simple_list_item_1;
setListAdapter(new ArrayAdapter<String>(getActivity(), layout, Ipsum.Headlines));
}
@Override
public void onStart() {
super.onStart();
//大屏
if (getFragmentManager().findFragmentById(R.id.article_fragment) != null) {
getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);//选择模式(单选,还有多选模式)
}
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mCallback = (OnHeadlineSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ "必须要实现OnHeadlineSelectedListener");
}
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
//调用此方法实现接口回调
mCallback.onArticleSelected(position);
getListView().setItemChecked(position, true);
}
}
MainActivity.java
public class MainActivity extends FragmentActivity
implements HeadlinesFragment.OnHeadlineSelectedListener {
/**
*savedInstanceState保存Activity的状态信息 */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.news_articles);
/**
* 此条件成立则设备是小屏设备*/
if (findViewById(R.id.fragment_container) != null) {
if (savedInstanceState != null) {
return;
}
//实例化Fragment
HeadlinesFragment firstFragment = new HeadlinesFragment();
Bundle bundle=getIntent().getExtras();
firstFragment.setArguments(bundle);
//开启事务,然后提交
getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, firstFragment).commit();
}
}
public void onArticleSelected(int position) {
ArticleFragment articleFrag = (ArticleFragment)getSupportFragmentManager().findFragmentById(R.id.article_fragment);
//加载的是大屏布局文件
if (articleFrag != null) {
articleFrag.updateArticleView(position);
} else {
//加载的是小屏布局文件
ArticleFragment newFragment = new ArticleFragment();
Bundle args = new Bundle();
//通过Bundle携带所点击列表项的id值发送给ArticleFragment
args.putInt(ArticleFragment.ARG_POSITION, position);
newFragment.setArguments(args);
//事务
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
transaction.commit();//提交
}
}
}
ArticleFragment.java
public class ArticleFragment extends Fragment {
final static String ARG_POSITION = "position";
int mCurrentPosition = -1;
//加载布局的时候调用
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (savedInstanceState != null) {
mCurrentPosition = savedInstanceState.getInt(ARG_POSITION);
}
return inflater.inflate(R.layout.article_view, container, false);
}
@Override
public void onStart() {
super.onStart();
Bundle args = getArguments();//在该步接受HeadlinesFragment传递过来的Bundle
if (args != null) {
int i=args.getInt(ARG_POSITION);
updateArticleView(i);
} else if (mCurrentPosition != -1) {//此处是针对应用崩溃时onCreateView得到的保存的状态值调用
updateArticleView(mCurrentPosition);
}
}
//显示对应的文章
public void updateArticleView(int position) {
TextView article = (TextView) getActivity().findViewById(R.id.article);
article.setText(Ipsum.Articles[position]);
mCurrentPosition = position;
}
//系统强制退出的时候调用(例如系统崩溃,应用崩溃),非人工退出
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(ARG_POSITION, mCurrentPosition);//保存状态
}
}
猛击下载资源