自己对于Fragment的一些总结
2014-06-01 22:10
309 查看
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 ( 用于大屏(平板))
//列表HeadlinesFragment .java
MainActivity.java
ArticleFragment.java
猛击下载资源
// 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);//保存状态 } }
猛击下载资源
相关文章推荐
- 总结下自己对于一些事物的看法
- 常用的一些技术词汇对照(自己总结)
- 把自己的一些技术总结移到CSDN上来
- 对于getting real开发结合自己的工作的一些思考
- 总结&分享一下自己最近的一些收获
- 自己总结的一些wap知识-WAP站点的MIME类型有哪些?如何添加?
- 从网上看到一些文章,自己再总结一下,在学习编程中一些要点
- 自己遇到的一些面试题总结 (1)
- 自己总结的一些VC常用技巧
- 自己总结的一些CSS调试的经验!
- 总结一下一些简单但是自己又不清楚的知识点(华为题目)
- 自己总结的一些数据库操作需要注意的东西
- 自己总结的一些需要注意的地方,含点个人小技巧&&经验
- css星级效果总结 取别人另加入自己的一些东东
- 自己对于服务器托管和购买虚拟机的一些看法
- 开发中碰到过的一些问题总结,给自己也给大家一个参考!
- 自己总结C/C++的一些容易被遗忘的基础知识!
- 自己总结的一些vim的用法
- 自己总结的一些J2ME开发经验点滴
- 对于前K短路径问题 和 A*算法 的一些小小总结