免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1940 | 回复: 1
打印 上一主题 下一主题

Android Fragments 详细使用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-02 11:52 |只看该作者 |倒序浏览
Android Fragments 详细使用









Fragments 诞生初衷
     自从Android 3.0中引入fragments 的概念,根据词海的翻译可以译为:碎片、片段。其上的是为了解决不同屏幕分辩率的动态和灵活UI设计。大屏幕如平板小屏幕如手机,平板电脑的设计使得其有更多的空间来放更多的UI组件,而多出来的空间存放UI使其会产生更多的交互,从而诞生了fragments 。fragments 的设计不需要你来亲自管理view hierarchy 的复杂变化,通过将Activity 的布局分散到frament 中,可以在运行时修改activity 的外观,并且由activity 管理的back stack 中保存些变化。


      Fragments 设计理念
      在设计应用时特别是Android 应用 ,有众多的分辨率要去适应,而fragments 可以让你在屏幕不同的屏幕上动态管理UI。例如:通讯应用程序(QQ),用户列表可以在左边,消息窗口在右边的设计。而在手机屏幕用户列表填充屏幕当点击某一用户时,则弹出对话窗口的设计,如下图:


Fragments的生命周期
    每一个fragments 都有自己的一套生命周期回调方法和处理自己的用户输入事件。 对应生命周期可参考下图:


其中大多数程序必须使用Fragments 必须实现的三个回调方法分别为:

onCreate

   系统创建Fragments 时调用,可做执行初始化工作或者当程序被暂停或停止时用来恢复状态,跟Activity 中的onCreate相当。

onCreateView

   用于首次绘制用户界面的回调方法,必须返回要创建的Fragments 视图UI。假如你不希望提供Fragments 用户界面则可以返回NULL。

onPause

    当用户离开这个Fragments 的时候调用,这时你要提交任何应该持久的变化,因为用户可能不会回来。更多的事件可以参考上图的生命周期关系图。

Fragments 的类别
    系统内置了三种Fragments ,这三种Fragments 分别有不同的应用场景分别为:

DialogFragment

对话框式的Fragments,可以将一个fragments 对话框并到activity 管理的fragments back stack 中,允许用户回到一个前曾摒弃fragments.

ListFragments

   类似于ListActivity 的效果,并且还提供了ListActivity 类似的onListItemCLick和setListAdapter等功能。

PreferenceFragments

   类似于PreferenceActivity .可以创建类似IPAD的设置界面。


Fragments 的详细使用
    首先先来看一张DEMO 效果图:


    左边点击时,右边的字符会与左边选中的项的字符相同。与IPAD上的设置界面很相似,这一点是否借鉴了ipad 上的UI呢?

相就的XML文件:
  1. 01.<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"

  2. 02.    android:layout_width="match_parent"

  3. 03.    android:layout_height="match_parent"

  4. 04.    android:orientation="horizontal" >

  5. 05.

  6. 06.   <fragment class="com.xuzhi.fragment.FragmentDemoActivity$TitlesFragment" android:id="@+id/titles" android:layout_weight="1"

  7. 07.       android:layout_width="0px" android:layout_height="match_parent"

  8. 08.       />

  9. 09.   

  10. 10.   <framelayout android:id="@+id/details" android:layout_weight="1" android:layout_width="0px" android:layout_height="match_parent"

  11. 11.       android:background="?android:attr/detailsElementBackground"

  12. 12.       >
  13. 复制代码
复制代码
主界面代码(己做注释):
  1. 01.package com.xuzhi.fragment;

  2. 02.import android.app.Activity;

  3. 03.import android.app.AlertDialog;

  4. 04.import android.app.Fragment;

  5. 05.import android.app.FragmentTransaction;

  6. 06.import android.app.ListFragment;

  7. 07.import android.os.Bundle;

  8. 08.import android.util.TypedValue;

  9. 09.import android.view.LayoutInflater;

  10. 10.import android.view.View;

  11. 11.import android.view.ViewGroup;

  12. 12.import android.widget.ArrayAdapter;

  13. 13.import android.widget.ListView;

  14. 14.import android.widget.ScrollView;

  15. 15.import android.widget.TextView;

  16. 16.

  17. 17.public class FragmentDemoActivity extends Activity {

  18. 18.

  19. 19.    public static String[] array = { "text1,", "text2", "text3", "text4",

  20. 20.            "text5,", "text6", "text7", "text8" };

  21. 21.

  22. 22.    /** Called when the activity is first created. */

  23. 23.    @Override

  24. 24.    public void onCreate(Bundle savedInstanceState) {

  25. 25.        super.onCreate(savedInstanceState);

  26. 26.        setContentView(R.layout.main);

  27. 27.    }

  28. 28.

  29. 29.        

  30. 30.    public static class TitlesFragment extends ListFragment {

  31. 31.

  32. 32.        boolean mDualPane;

  33. 33.        int mCurCheckPosition = 0;

  34. 34.        

  35. 35.        @Override

  36. 36.        public void onCreate(Bundle savedInstanceState) {

  37. 37.            // TODO Auto-generated method stub

  38. 38.            super.onCreate(savedInstanceState);

  39. 39.            System.out.println("Fragment-->onCreate");

  40. 40.        }

  41. 41.        

  42. 42.        @Override

  43. 43.        public View onCreateView(LayoutInflater inflater, ViewGroup container,

  44. 44.                Bundle savedInstanceState) {

  45. 45.            // TODO Auto-generated method stub

  46. 46.            System.out.println("Fragment-->onCreateView");

  47. 47.            return super.onCreateView(inflater, container, savedInstanceState);

  48. 48.        }

  49. 49.        

  50. 50.        @Override

  51. 51.        public void onPause() {

  52. 52.            // TODO Auto-generated method stub

  53. 53.            super.onPause();

  54. 54.            System.out.println("Fragment-->onPause");

  55. 55.        }

  56. 56.        

  57. 57.        

  58. 58.        @Override

  59. 59.        public void onStop() {

  60. 60.            // TODO Auto-generated method stub

  61. 61.            super.onStop();

  62. 62.            

  63. 63.            System.out.println("Fragment-->onStop");

  64. 64.        }

  65. 65.        

  66. 66.        @Override

  67. 67.        public void onAttach(Activity activity) {

  68. 68.            // TODO Auto-generated method stub

  69. 69.            super.onAttach(activity);

  70. 70.            System.out.println("Fragment-->onAttach");

  71. 71.        }

  72. 72.        

  73. 73.        @Override

  74. 74.        public void onStart() {

  75. 75.            // TODO Auto-generated method stub

  76. 76.            super.onStart();

  77. 77.            System.out.println("Fragment-->onStart");

  78. 78.        }

  79. 79.        

  80. 80.        @Override

  81. 81.        public void onResume() {

  82. 82.            // TODO Auto-generated method stub

  83. 83.            super.onResume();

  84. 84.            System.out.println("Fragment-->onResume");

  85. 85.        }

  86. 86.        

  87. 87.        @Override

  88. 88.        public void onDestroy() {

  89. 89.            // TODO Auto-generated method stub

  90. 90.            super.onDestroy();

  91. 91.            System.out.println("Fragment-->onDestroy");

  92. 92.        }

  93. 93.        

  94. 94.        

  95. 95.

  96. 96.        @Override

  97. 97.        public void onActivityCreated(Bundle savedInstanceState) {

  98. 98.            // TODO Auto-generated method stub

  99. 99.            super.onActivityCreated(savedInstanceState);

  100. 100.            System.out.println("Fragment-->onActivityCreted");

  101. 101.            setListAdapter(new ArrayAdapter(getActivity(),

  102. 102.                    android.R.layout.simple_list_item_1, array));

  103. 103.

  104. 104.            View detailsFrame = getActivity().findViewById(R.id.details);

  105. 105.

  106. 106.            mDualPane = detailsFrame != null

  107. 107.                    && detailsFrame.getVisibility() == View.VISIBLE;

  108. 108.

  109. 109.            if (savedInstanceState != null) {

  110. 110.                mCurCheckPosition = savedInstanceState.getInt("curChoice", 0); //从保存的状态中取出数据

  111. 111.            }

  112. 112.

  113. 113.            if (mDualPane) {

  114. 114.                getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);

  115. 115.

  116. 116.                showDetails(mCurCheckPosition);

  117. 117.            }

  118. 118.        }

  119. 119.

  120. 120.        @Override

  121. 121.        public void onSaveInstanceState(Bundle outState) {

  122. 122.            // TODO Auto-generated method stub

  123. 123.            super.onSaveInstanceState(outState);

  124. 124.

  125. 125.            outState.putInt("curChoice", mCurCheckPosition);//保存当前的下标

  126. 126.        }

  127. 127.

  128. 128.        @Override

  129. 129.        public void onListItemClick(ListView l, View v, int position, long id) {

  130. 130.            // TODO Auto-generated method stub

  131. 131.            super.onListItemClick(l, v, position, id);

  132. 132.            showDetails(position);

  133. 133.        }

  134. 134.

  135. 135.        void showDetails(int index) {

  136. 136.            mCurCheckPosition = index;

  137. 137.            if (mDualPane) {

  138. 138.                getListView().setItemChecked(index, true);

  139. 139.                DetailsFragment details = (DetailsFragment) getFragmentManager()

  140. 140.                        .findFragmentById(R.id.details);

  141. 141.                if (details == null || details.getShownIndex() != index) {

  142. 142.                    details = DetailsFragment.newInstance(mCurCheckPosition);

  143. 143.

  144. 144.                    //得到一个fragment 事务(类似sqlite的操作)

  145. 145.                    FragmentTransaction ft = getFragmentManager()

  146. 146.                            .beginTransaction();

  147. 147.                    ft.replace(R.id.details, details);//将得到的fragment 替换当前的viewGroup内容,add则不替换会依次累加

  148. 148.                    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);//设置动画效果

  149. 149.                    ft.commit();//提交

  150. 150.                }

  151. 151.            } else {

  152. 152.                new AlertDialog.Builder(getActivity()).setTitle(

  153. 153.                        android.R.string.dialog_alert_title).setMessage(

  154. 154.                        array[index]).setPositiveButton(android.R.string.ok,

  155. 155.                        null).show();

  156. 156.            }

  157. 157.        }

  158. 158.    }

  159. 159.

  160. 160.    /**

  161. 161.     * 作为界面的一部分,为fragment 提供一个layout

  162. 162.     * @author terry

  163. 163.     *

  164. 164.     */

  165. 165.    public static class DetailsFragment extends Fragment {

  166. 166.

  167. 167.        public static DetailsFragment newInstance(int index) {

  168. 168.            DetailsFragment details = new DetailsFragment();

  169. 169.            Bundle args = new Bundle();

  170. 170.            args.putInt("index", index);

  171. 171.            details.setArguments(args);

  172. 172.            return details;

  173. 173.        }

  174. 174.

  175. 175.        public int getShownIndex() {

  176. 176.            return getArguments().getInt("index", 0);

  177. 177.        }

  178. 178.

  179. 179.        @Override

  180. 180.        public View onCreateView(LayoutInflater inflater, ViewGroup container,

  181. 181.                Bundle savedInstanceState) {

  182. 182.            // TODO Auto-generated method stub

  183. 183.            if (container == null)

  184. 184.                return null;

  185. 185.

  186. 186.            ScrollView scroller = new ScrollView(getActivity());

  187. 187.            TextView text = new TextView(getActivity());

  188. 188.

  189. 189.            int padding = (int) TypedValue.applyDimension(

  190. 190.                    TypedValue.COMPLEX_UNIT_DIP, 4, getActivity()

  191. 191.                            .getResources().getDisplayMetrics());

  192. 192.            text.setPadding(padding, padding, padding, padding);

  193. 193.            scroller.addView(text);

  194. 194.

  195. 195.            text.setText(array[getShownIndex()]);

  196. 196.            return scroller;

  197. 197.        }

  198. 198.    }

  199. 199.}
  200. 复制代码
复制代码
注意:
1.如果你想在Fragment 里面创建menu,则必须在onCreate的时候设置让它可以存在optionMenu才可以创建,代码为:
2.
  1. 01.public static class DetailsFragment extends Fragment {

  2. 02.

  3. 03.        @Override

  4. 04.        public void onCreate(Bundle savedInstanceState) {

  5. 05.            // TODO Auto-generated method stub

  6. 06.            super.onCreate(savedInstanceState);

  7. 07.            setHasOptionsMenu(true);

  8. 08.        }

  9. 09.}
  10. 复制代码
复制代码
之后的操作即可以像平常Android的menu用法一样,代码为:
3.
  1. 01.@Override

  2. 02.        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

  3. 03.            // TODO Auto-generated method stub

  4. 04.            super.onCreateOptionsMenu(menu, inflater);

  5. 05.             menu.add("Menu 1a").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);

  6. 06.                menu.add("Menu 1b").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);

  7. 07.        }

  8. 08.        

  9. 09.        @Override

  10. 10.        public boolean onOptionsItemSelected(MenuItem item) {

  11. 11.            // TODO Auto-generated method stub

  12. 12.            Toast.makeText(getActivity(), "index is"+getShownIndex()+" && menu text is "+item.getTitle(), 1000).show();

  13. 13.            return super.onOptionsItemSelected(item);

  14. 14.        }
  15. 复制代码
复制代码
更多详细的使用方法,请参考SDK和APIDEMO中相关的例子和解释。DEMO下载 FragmentDemo.zip (61.32 KB, 下载次数: 211)

论坛徽章:
0
2 [报告]
发表于 2012-03-02 11:53 |只看该作者
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP