今天继续完成剩下的学习部分,现在项目很多地方使用viewpager来提供滑动,今天记录学习viewpager配合fragment的显示,增加一个CallLogsFragment配合之前SMSListFragment
1.CallLogsFragment,主要显示手机的电话记录,这都是之前的代码,所以只要把Activity转换成Fragment就可以了,也一样, 
Activity.setContentView(int) 转变成Fragment.onCreateView(View) 并且 findViewById也在里面了
Activity.onCreate() 代码 转成  Fragment.onActivityCreated()中
Activity.onResume() 代码 转成 Fragment.onResume() 中

代码如下:

  1. public class CallLogsFragment extends Fragment{
  2. private ListView vList;
  3. private CallPanelView vDial;
  4. private TextView vShowDial;
  5. private CallListAdapter mAdapter;
  6. private Animation mDialHidAnim;
  7. private Animation mDialShowAnim;
  8. @Override
  9. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  10. Bundle savedInstanceState) {
  11. // TODO Auto-generated method stub
  12. View root = inflater.inflate(R.layout.activity_calls_list_screen, null);
  13. vList = (ListView) root.findViewById(R.id.activity_call_list_lv);
  14. vShowDial = (TextView) root.findViewById(R.id.activity_call_show_dial);
  15. vDial = (CallPanelView) root.findViewById(R.id.dial_panel_view);
  16. return root;
  17. }
  18. @Override
  19. public void onActivityCreated(Bundle savedInstanceState) {
  20. // TODO Auto-generated method stub
  21. super.onActivityCreated(savedInstanceState);
  22. prepareResourceAndData();
  23. bindView();
  24. }
  25. @Override
  26. public void onResume() {
  27. // TODO Auto-generated method stub
  28. super.onResume();
  29. mAdapter.setCallNumbers(CallCache.getInstance().getCallNumbers());
  30. }
  31. private void prepareResourceAndData() {
  32. mAdapter = new CallListAdapter(getActivity());
  33. mDialHidAnim = AnimationUtils.loadAnimation(getActivity().getApplicationContext(),
  34. R.anim.dial_panel_hidden);
  35. mDialHidAnim.setAnimationListener(new AnimationListener() {
  36. public void onAnimationStart(Animation animation) {}
  37. public void onAnimationRepeat(Animation animation) {}
  38. public void onAnimationEnd(Animation animation) {
  39. // End
  40. vShowDial.setVisibility(View.VISIBLE);
  41. vDial.setVisibility(View.GONE);
  42. }
  43. });
  44. mDialShowAnim = AnimationUtils.loadAnimation(getActivity().getApplicationContext(),
  45. R.anim.dial_panel_show);
  46. mDialShowAnim.setAnimationListener(new AnimationListener() {
  47. public void onAnimationStart(Animation animation) {}
  48. public void onAnimationRepeat(Animation animation) {}
  49. public void onAnimationEnd(Animation animation) {
  50. // End
  51. vShowDial.setVisibility(View.GONE);
  52. }
  53. });
  54. }
  55. private void bindView() {
  56. vList.setAdapter(mAdapter);
  57. vList.setOnItemClickListener(new OnItemClickListener() {
  58. @Override
  59. public void onItemClick(AdapterView<?> parent, View view,
  60. int position, long id) {
  61. // TODO Auto-generated method stub
  62. CallItemView itemview = (CallItemView) view;
  63. itemview.toggleExpand();
  64. hidDialPanel(true);
  65. }
  66. });
  67. vList.setOnScrollListener(new OnScrollListener() {
  68. public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {}
  69. @Override
  70. public void onScrollStateChanged(AbsListView view, int scrollState) {
  71. // TODO Auto-generated method stub
  72. if (scrollState == OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
  73. hidDialPanel(false);
  74. }
  75. }
  76. });
  77. vDial.setPanelAnim(mDialShowAnim, mDialHidAnim);
  78. vShowDial.setVisibility(View.GONE);
  79. vShowDial.setOnClickListener(new OnClickListener() {
  80. @Override
  81. public void onClick(View v) {
  82. // TODO Auto-generated method stub
  83. vDial.show();
  84. }
  85. });
  86. }
  87. private void hidDialPanel(boolean anim) {
  88. if (vDial.getVisibility() == View.VISIBLE) {
  89. if(anim){
  90. vDial.dismiss();
  91. }else{
  92. vDial.setVisibility(View.GONE);
  93. vShowDial.setVisibility(View.VISIBLE);
  94. }
  95. }
  96. }
  97. }
  98. }

2.对昨天主页面布局修改,增加ViewPager,去掉原有的容器framelayout:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <
  3. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:id="@+id/door_root_content_fl"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent" >
  7. <LinearLayout
  8. android:layout_width="match_parent"
  9. android:layout_height="match_parent"
  10. android:orientation="vertical" >
  11. <android.support.v4.view.ViewPager
  12. android:id="@+id/door_viewpager_content_vp"
  13. android:layout_width="match_parent"
  14. android:layout_height="0dp"
  15. android:layout_weight="1" />
  16. <LinearLayout
  17. android:layout_width="match_parent"
  18. android:layout_height="55dp"
  19. android:orientation="horizontal" >
  20. <Button
  21. android:id="@+id/door_menu_btn"
  22. android:layout_width="match_parent"
  23. android:layout_height="match_parent"
  24. android:gravity="center"
  25. android:text="菜单" />
  26. </LinearLayout>
  27. </LinearLayout>
  28. <
  29. </FrameLayout>

3.V4 support 包里面已经帮我们写好了 FragmentPagerAdapter,看源码可以知道在 PageAdapter.instantiateItem中,有:

  1. Fragment fragment = mFragmentManager.findFragmentByTag(name);
  2. if (fragment != null) {
  3. if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);
  4. mCurTransaction.attach(fragment);
  5. } else {
  6. fragment = getItem(position);
  7. if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);
  8. mCurTransaction.add(container.getId(), fragment,
  9. makeFragmentName(container.getId(), itemId));
  10. }

可以看出
ViewPager在添加fragment
的时候先在FragmentManager里面找有没有,如果没有就会去请求PageAdapter.getItem(position)来生成
fragment,进行添加,因此我们只要重写FragmentPagerAdapter并实现getItem方法就可以了,代码如下:

  1. class FragmentAdapter extends FragmentPagerAdapter{
  2. public FragmentAdapter(FragmentManager fm) {
  3. super(fm);
  4. // TODO Auto-generated constructor stub
  5. }
  6. @Override
  7. public Fragment getItem(int position) {
  8. // TODO Auto-generated method stub
  9. return getPagerFragmentByPosition(position);
  10. }
  11. @Override
  12. public int getCount() {
  13. // TODO Auto-generated method stub
  14. return 2;
  15. }
  16. }private Fragment getPagerFragmentByPosition(int position){
  17. if(position == FRAG_INDEX_CALL_LOG){
  18. return new CallLogsFragment();
  19. }
  20. if(position == FRAG_INDEX_SMS){
  21. return new SMSListFragment();
  22. }
  23. return null;
  24. }

4.页面完整代码:

  1. public class DoorFragmentActivity extends FragmentActivity{
  2. public static final String FRAG_SMS = "sms_list_frag";
  3. public static final String FRAG_TEXT = "text_frag";
  4. public static final int FRAG_INDEX_CALL_LOG = 0;
  5. public static final int FRAG_INDEX_SMS = 1;
  6. private Fragment mTextFragment;
  7. private FragmentManager mFragMgr;
  8. private ViewPager vViewPager;
  9. private Button mMenuBtn;
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. // TODO Auto-generated method stub
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.door_fragment_activity_layout);
  15. initFragments();
  16. bindViews();
  17. }
  18. private void bindViews(){
  19. mMenuBtn = (Button) findViewById(R.id.door_menu_btn);
  20. mMenuBtn.setOnClickListener(new OnClickListener() {
  21. @Override
  22. public void onClick(View v) {
  23. // TODO Auto-generated method stub
  24. showOutFragments(FRAG_TEXT, true);
  25. }
  26. });
  27. vViewPager = (ViewPager) findViewById(R.id.door_viewpager_content_vp);
  28. vViewPager.setAdapter(new FragmentAdapter(mFragMgr));
  29. }
  30. private void initFragments(){
  31. mFragMgr = getSupportFragmentManager();
  32. TextFragment textfrag = new TextFragment();
  33. textfrag.setMessage("这是 菜单界面");
  34. mTextFragment = textfrag;
  35. }
  36. private void showOutFragments(String tag, boolean needback){
  37. FragmentTransaction trans = mFragMgr.beginTransaction();
  38. trans.setCustomAnimations(R.anim.frag_enter,
  39. R.anim.frag_exit);
  40. trans.add(R.id.door_root_content_fl, getFragmentByTag(tag), tag);
  41. if(needback){
  42. trans.addToBackStack(tag);
  43. }
  44. trans.commit();
  45. }
  46. private Fragment getFragmentByTag(String tag){
  47. if(FRAG_TEXT.equals(tag)){
  48. return mTextFragment;
  49. }
  50. return null;
  51. }
  52. private Fragment getPagerFragmentByPosition(int position){
  53. if(position == FRAG_INDEX_CALL_LOG){
  54. return new CallLogsFragment();
  55. }
  56. if(position == FRAG_INDEX_SMS){
  57. return new SMSListFragment();
  58. }
  59. return null;
  60. }
  61. class FragmentAdapter extends FragmentPagerAdapter{
  62. public FragmentAdapter(FragmentManager fm) {
  63. super(fm);
  64. // TODO Auto-generated constructor stub
  65. }
  66. @Override
  67. public Fragment getItem(int position) {
  68. // TODO Auto-generated method stub
  69. return getPagerFragmentByPosition(position);
  70. }
  71. @Override
  72. public int getCount() {
  73. // TODO Auto-generated method stub
  74. return 2;
  75. }
  76. }
  77. }
  78. }

5.效果图,左右滑动显示通话记录和短信:

    1. <pre code_snippet_id="94266" snippet_file_name="blog_20131203_4_3649255"></pre>
    2. <pre></pre>

Fragment 和 FragmentActivity的使用(二)的更多相关文章

  1. Fragment和FragmentActivity的使用方法

    认识:首先我们知道Fragment是我们在单个Activity上要切换多个UI界面,显示不同内容.模块化这些UI面板以便提供给其他Acitivity使用便利.同时我们显示的Fragment也会受到当前 ...

  2. Fragment与FragmentActivity的关系

    前阵用viewpaper+fragment做滑动引导,查阅了下网上的资料,发现在有两种做法,一个是自建类直接继承Activity另一种是继承FragmentActivity,很是迷惑,在查了些goog ...

  3. Fragment 和 FragmentActivity的使用

    Fragment 和 FragmentActivity的使用 http://blog.csdn.net/izy0001989624/article/details/17072211

  4. Fragment与FragmentActivity通信封装

    在项目里面会经常用到Fragment与FragmentActivity,比如Fragment之间的界面切换与Fragment之间的值传递等等,为了方便起见我把Fragment和FragmentActi ...

  5. 转 Fragment 和 FragmentActivity的使用

    今天学习下 Android中的 Fragment 和 FragmentActivity,因为没有4.0手机,平台是2.3.3 所以我是使用 v4 support 包来进行学习. 要想用Fragment ...

  6. ☆ fragment和fragmentactivity解析 (转)

    一.为什么要使用Fragment  1.当我们需要动态的多界面切换的时候,就需要将UI元素和Activity融合成一 个模块.在2.3中我们一般通过各种Activity中进行跳转来实现多界面的跳转和单 ...

  7. Android Fragment和FragmentActivity区别和用法

    Android Fragment是Android4.0以上才有的:而FragmentActivity是为了兼容4.0以下版本的Fragment使用的. 所以如果你想兼容4.0以下Android版本使用 ...

  8. fragment和fragmentactivity解析

    一.为什么要使用Fragment  1.当我们须要动态的多界面切换的时候,就须要将UI元素和Activity融合成一个模块.在2.3中我们一般通过各种Activity中进行跳转来实现多界面的跳转和单个 ...

  9. Android组件内核之Fragment管理与内核(二)

    阿里P7Android高级架构进阶视频免费学习请点击:https://space.bilibili.com/474380680本篇文章将先从以下三个内容来介绍Fragment管理与内核: [Fragm ...

随机推荐

  1. python学习小结4:类

    虽然Python是解释性语言,但是它是面向对象的,能够进行对象编程. 类和对象是面向对象编程的两个主要方面.类:创建一个新类型,而对象是这个类的实例,类使用class关键字创建.类的域和方法被列在一个 ...

  2. webview加载本地html

    //webView.loadUrl("file:///android_asset/index.html"); 加载assets目录中含有的index.html  webView.l ...

  3. EntityFramework Add方法与Attach区别

    一 先发问. 问题:在使用EF过程中,能否有一个方法可以直接执行传入的SQL语句.纠结的只找到了调用存储过程的方法,难道要SqlHelper.cs?    二 友情提示 本文内容参考自MSDN. 三 ...

  4. 编写一个小程序,从标准输入读入一系列string对象,寻找连续重复出现的单词。程序应该找出满足一下条件的单词:该单词的后面紧接着再次出现自己本身。跟踪重复次数最多的单词及其重复次数,输出.

    // test13.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  5. Nginx 301重定向域名

    为何要使用301重定向 在网站建设中需要网页重定向的情况很多:如网页目录结构变动,网页重命名.网页的扩展名改变.网站域名改变等.如果不做重定向,用户的收藏和搜索引擎数据库中的旧地址只能让访客得到一个4 ...

  6. 【C++之STL】理解容器(ing)

    “容器可容纳一些数据的模板类” “容器是包容其他对象的对象” 两种类型:顺序容器.关联容器   顺序容器 关联容器 访问成员 顺序访问和随机访问 经过优化关键键值访问                 ...

  7. POJ 2912 Rochambeau(难,好题,枚举+带权并查集)

    下面的是从该网站上copy过来的,稍微改了一点,给出链接:http://hi.baidu.com/nondes/item/26dd0f1a02b1e0ef5f53b1c7 题意:有N个人玩剪刀石头布, ...

  8. java基础知识回顾之---java String final类普通方法的应用之“模拟字符串Trim方法”

    /* * 4,模拟一个trim功能一致的方法.去除字符串两端的空白  * 思路: * 1,定义两个变量. * 一个变量作为从头开始判断字符串空格的角标.不断++. * 一个变量作为从尾开始判断字符串空 ...

  9. Struts2 本是非单例的,与Spring集成就默认为单例

    1.Struts2本身action类是多例,此设计的原因在于本身action担任了数据载体,如果做成单例,则会便多用户数据受到影响: 2.当Struts2 与 spring整合时,Struts2的Ac ...

  10. 【互联网那些事儿】小度 i 耳目

    关于这个产品是什么,大家自行度. 这里我主要想说的,是百度关于这个产品的一点……呃,“卖萌”的介绍语言. 小度i耳目常见问题 问:为什么叫小度i耳目呢,貌似不太好记忆. 答:名字嘛都是父母起的,不过时 ...