zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    IE8下提示'console'未定义错误
    左右添加和删除
    箭头函数
    事件冒泡
    选中状态改变,并且实现左边选中便便添加
    appcan里面模板的使用
    白面机器学习笔记(一)
    常见的模型加速方法
    相机的参数
    深度学习和机器学习的区别
  • 原文地址:https://www.cnblogs.com/xgjblog/p/4040002.html
Copyright © 2011-2022 走看看