Fragment 和 FragmentActivity的使用(二)

 

今天继续完成剩下的学习部分,现在项目很多地方使用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.   
  3.   
  4. private ListView vList;  
  5.   
  6. private CallPanelView vDial;  
  7.   
  8. private TextView vShowDial;  
  9.   
  10. private CallListAdapter mAdapter;  
  11.   
  12.   
  13.   
  14. private Animation mDialHidAnim;  
  15.   
  16. private Animation mDialShowAnim;  
  17.   
  18.   
  19. @Override  
  20.   
  21. public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  22.   
  23. Bundle savedInstanceState) {  
  24.   
  25. // TODO Auto-generated method stub  
  26.   
  27. View root = inflater.inflate(R.layout.activity_calls_list_screen, null);  
  28.   
  29. vList = (ListView) root.findViewById(R.id.activity_call_list_lv);  
  30.   
  31. vShowDial = (TextView) root.findViewById(R.id.activity_call_show_dial);  
  32.   
  33. vDial = (CallPanelView) root.findViewById(R.id.dial_panel_view);  
  34.   
  35. return root;  
  36.   
  37. }  
  38.   
  39.   
  40. @Override  
  41.   
  42. public void onActivityCreated(Bundle savedInstanceState) {  
  43.   
  44. // TODO Auto-generated method stub  
  45.   
  46. super.onActivityCreated(savedInstanceState);  
  47.   
  48. prepareResourceAndData();  
  49.   
  50. bindView();  
  51.   
  52. }  
  53.   
  54.   
  55. @Override  
  56.   
  57. public void onResume() {  
  58.   
  59. // TODO Auto-generated method stub  
  60.   
  61. super.onResume();  
  62.   
  63. mAdapter.setCallNumbers(CallCache.getInstance().getCallNumbers());  
  64.   
  65. }  
  66.   
  67.   
  68. private void prepareResourceAndData() {  
  69.   
  70. mAdapter = new CallListAdapter(getActivity());  
  71.   
  72. mDialHidAnim = AnimationUtils.loadAnimation(getActivity().getApplicationContext(),  
  73.   
  74. R.anim.dial_panel_hidden);  
  75.   
  76. mDialHidAnim.setAnimationListener(new AnimationListener() {  
  77.   
  78. public void onAnimationStart(Animation animation) {}  
  79.   
  80. public void onAnimationRepeat(Animation animation) {}  
  81.   
  82. public void onAnimationEnd(Animation animation) {  
  83.   
  84. // End  
  85.   
  86. vShowDial.setVisibility(View.VISIBLE);  
  87.   
  88. vDial.setVisibility(View.GONE);  
  89.   
  90. }  
  91.   
  92. });  
  93.   
  94.   
  95.   
  96. mDialShowAnim = AnimationUtils.loadAnimation(getActivity().getApplicationContext(),  
  97.   
  98. R.anim.dial_panel_show);  
  99.   
  100. mDialShowAnim.setAnimationListener(new AnimationListener() {  
  101.   
  102. public void onAnimationStart(Animation animation) {}  
  103.   
  104. public void onAnimationRepeat(Animation animation) {}  
  105.   
  106. public void onAnimationEnd(Animation animation) {  
  107.   
  108. // End  
  109.   
  110. vShowDial.setVisibility(View.GONE);  
  111.   
  112. }  
  113.   
  114. });  
  115.   
  116. }  
  117.   
  118.   
  119. private void bindView() {  
  120.   
  121. vList.setAdapter(mAdapter);  
  122.   
  123. vList.setOnItemClickListener(new OnItemClickListener() {  
  124.   
  125.   
  126.   
  127. @Override  
  128.   
  129. public void onItemClick(AdapterView<?> parent, View view,  
  130.   
  131. int position, long id) {  
  132.   
  133. // TODO Auto-generated method stub  
  134.   
  135. CallItemView itemview = (CallItemView) view;  
  136.   
  137. itemview.toggleExpand();  
  138.   
  139. hidDialPanel(true);  
  140.   
  141. }  
  142.   
  143. });  
  144.   
  145.   
  146.   
  147. vList.setOnScrollListener(new OnScrollListener() {  
  148.   
  149. public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {}  
  150.   
  151. @Override  
  152.   
  153. public void onScrollStateChanged(AbsListView view, int scrollState) {  
  154.   
  155. // TODO Auto-generated method stub  
  156.   
  157. if (scrollState == OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {  
  158.   
  159. hidDialPanel(false);  
  160.   
  161. }  
  162.   
  163. }  
  164.   
  165. });  
  166.   
  167.   
  168.   
  169. vDial.setPanelAnim(mDialShowAnim, mDialHidAnim);  
  170.   
  171.   
  172.   
  173.   
  174. vShowDial.setVisibility(View.GONE);  
  175.   
  176. vShowDial.setOnClickListener(new OnClickListener() {  
  177.   
  178.   
  179.   
  180. @Override  
  181.   
  182. public void onClick(View v) {  
  183.   
  184. // TODO Auto-generated method stub  
  185.   
  186. vDial.show();  
  187.   
  188. }  
  189.   
  190. });  
  191.   
  192. }  
  193.   
  194.   
  195.   
  196. private void hidDialPanel(boolean anim) {  
  197.   
  198. if (vDial.getVisibility() == View.VISIBLE) {  
  199.   
  200. if(anim){  
  201.   
  202. vDial.dismiss();  
  203.   
  204. }else{  
  205.   
  206. vDial.setVisibility(View.GONE);  
  207.   
  208. vShowDial.setVisibility(View.VISIBLE);  
  209.   
  210. }  
  211.   
  212. }  
  213.   
  214. }  
  215. }  
  216. }  


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

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <  
  3. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  4.    
  5.     android:id="@+id/door_root_content_fl"  
  6.    
  7.     android:layout_width="match_parent"  
  8.    
  9.     android:layout_height="match_parent" >  
  10.   
  11.   
  12.   
  13.     <LinearLayout  
  14.    
  15.         android:layout_width="match_parent"  
  16.    
  17.         android:layout_height="match_parent"  
  18.    
  19.         android:orientation="vertical" >  
  20.   
  21.   
  22.   
  23.         <android.support.v4.view.ViewPager  
  24.    
  25.             android:id="@+id/door_viewpager_content_vp"  
  26.    
  27.             android:layout_width="match_parent"  
  28.    
  29.             android:layout_height="0dp"  
  30.    
  31.             android:layout_weight="1" />  
  32.   
  33.   
  34.   
  35.         <LinearLayout  
  36.    
  37.             android:layout_width="match_parent"  
  38.    
  39.             android:layout_height="55dp"  
  40.    
  41.             android:orientation="horizontal" >  
  42.   
  43.   
  44.   
  45.             <Button  
  46.    
  47.                 android:id="@+id/door_menu_btn"  
  48.    
  49.                 android:layout_width="match_parent"  
  50.    
  51.                 android:layout_height="match_parent"  
  52.    
  53.                 android:gravity="center"  
  54.    
  55.                 android:text="菜单" />  
  56.    
  57.         </LinearLayout>  
  58.    
  59.     </LinearLayout>  
  60.   
  61.   
  62.   
  63. <  
  64. </FrameLayout>  


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

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


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

  1. class FragmentAdapter extends FragmentPagerAdapter{  
  2.   
  3.   
  4.   
  5. public FragmentAdapter(FragmentManager fm) {  
  6.   
  7. super(fm);  
  8.   
  9. // TODO Auto-generated constructor stub  
  10.   
  11. }  
  12.   
  13.   
  14.   
  15. @Override  
  16.   
  17. public Fragment getItem(int position) {  
  18.   
  19. // TODO Auto-generated method stub  
  20.   
  21. return getPagerFragmentByPosition(position);  
  22.   
  23. }  
  24.   
  25.   
  26.   
  27. @Override  
  28.   
  29. public int getCount() {  
  30.   
  31. // TODO Auto-generated method stub  
  32.   
  33. return 2;  
  34.   
  35. }  
  36.   
  37.   
  38. }private Fragment getPagerFragmentByPosition(int position){  
  39.   
  40. if(position == FRAG_INDEX_CALL_LOG){  
  41.   
  42. return new CallLogsFragment();  
  43.   
  44. }  
  45.   
  46. if(position == FRAG_INDEX_SMS){  
  47.   
  48. return new SMSListFragment();  
  49.   
  50. }  
  51.   
  52. return null;  
  53.   
  54. }  


4.页面完整代码:

  1. public class DoorFragmentActivity extends FragmentActivity{  
  2.   
  3.   
  4.   
  5. public static final String FRAG_SMS = "sms_list_frag";  
  6.   
  7. public static final String FRAG_TEXT = "text_frag";  
  8.   
  9.   
  10. public static final int FRAG_INDEX_CALL_LOG = 0;  
  11.   
  12. public static final int FRAG_INDEX_SMS = 1;  
  13.   
  14.   
  15. private Fragment mTextFragment;  
  16.   
  17. private FragmentManager mFragMgr;  
  18.   
  19.   
  20. private ViewPager vViewPager;  
  21.   
  22.   
  23. private Button mMenuBtn;  
  24.   
  25.   
  26. @Override  
  27.   
  28. protected void onCreate(Bundle savedInstanceState) {  
  29.   
  30. // TODO Auto-generated method stub  
  31.   
  32. super.onCreate(savedInstanceState);  
  33.   
  34. setContentView(R.layout.door_fragment_activity_layout);  
  35.   
  36. initFragments();  
  37.   
  38. bindViews();  
  39.   
  40. }  
  41.   
  42.   
  43. private void bindViews(){  
  44.   
  45. mMenuBtn = (Button) findViewById(R.id.door_menu_btn);  
  46.   
  47. mMenuBtn.setOnClickListener(new OnClickListener() {  
  48.   
  49.   
  50. @Override  
  51.   
  52. public void onClick(View v) {  
  53.   
  54. // TODO Auto-generated method stub  
  55.   
  56. showOutFragments(FRAG_TEXT, true);  
  57.   
  58. }  
  59.   
  60. });  
  61.   
  62. vViewPager = (ViewPager) findViewById(R.id.door_viewpager_content_vp);  
  63.   
  64. vViewPager.setAdapter(new FragmentAdapter(mFragMgr));  
  65.   
  66. }  
  67.   
  68.   
  69. private void initFragments(){  
  70.   
  71. mFragMgr = getSupportFragmentManager();  
  72.   
  73. TextFragment textfrag = new TextFragment();  
  74.   
  75. textfrag.setMessage("这是 菜单界面");  
  76.   
  77. mTextFragment = textfrag;  
  78.   
  79. }  
  80.   
  81.   
  82. private void showOutFragments(String tag, boolean needback){  
  83.   
  84. FragmentTransaction trans = mFragMgr.beginTransaction();  
  85.   
  86. trans.setCustomAnimations(R.anim.frag_enter,    
  87.   
  88. R.anim.frag_exit);  
  89.   
  90. trans.add(R.id.door_root_content_fl, getFragmentByTag(tag), tag);  
  91.   
  92. if(needback){  
  93.   
  94. trans.addToBackStack(tag);  
  95.   
  96. }  
  97.   
  98. trans.commit();  
  99.   
  100. }  
  101.   
  102.   
  103. private Fragment getFragmentByTag(String tag){  
  104.   
  105. if(FRAG_TEXT.equals(tag)){  
  106.   
  107. return mTextFragment;  
  108.   
  109. }  
  110.   
  111. return null;  
  112.   
  113. }  
  114.   
  115.   
  116. private Fragment getPagerFragmentByPosition(int position){  
  117.   
  118. if(position == FRAG_INDEX_CALL_LOG){  
  119.   
  120. return new CallLogsFragment();  
  121.   
  122. }  
  123.   
  124. if(position == FRAG_INDEX_SMS){  
  125.   
  126. return new SMSListFragment();  
  127.   
  128. }  
  129.   
  130. return null;  
  131.   
  132. }  
  133.   
  134.   
  135. class FragmentAdapter extends FragmentPagerAdapter{  
  136.   
  137.   
  138.   
  139. public FragmentAdapter(FragmentManager fm) {  
  140.   
  141. super(fm);  
  142.   
  143. // TODO Auto-generated constructor stub  
  144.   
  145. }  
  146.   
  147.   
  148.   
  149. @Override  
  150.   
  151. public Fragment getItem(int position) {  
  152.   
  153. // TODO Auto-generated method stub  
  154.   
  155. return getPagerFragmentByPosition(position);  
  156.   
  157. }  
  158.   
  159.   
  160.   
  161. @Override  
  162.   
  163. public int getCount() {  
  164.   
  165. // TODO Auto-generated method stub  
  166.   
  167. return 2;  
  168.   
  169. }  
  170.   
  171.   
  172. }  
  173. }  
  174. }  


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



    1. <pre code_snippet_id="94266" snippet_file_name="blog_20131203_4_3649255"></pre>  
    2. <pre></pre
原文地址:https://www.cnblogs.com/xgjblog/p/4040002.html