Android Fragments 详细使用

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文件:

01 <?xml version="1.0" encoding="utf-8"?>
02 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
03     android:layout_width="match_parent"
04     android:layout_height="match_parent"
05     android:orientation="horizontal" >
06  
07    <fragment class="com.xuzhi.fragment.FragmentDemoActivity$TitlesFragment"android:id="@+id/titles" android:layout_weight="1"
08        android:layout_width="0px" android:layout_height="match_parent"
09        />
10     
11    <FrameLayout android:id="@+id/details" android:layout_weight="1"android:layout_width="0px" android:layout_height="match_parent"
12        android:background="?android:attr/detailsElementBackground"
13        ></FrameLayout>
14 </LinearLayout>
主界面代码(己做注释):
001 package com.xuzhi.fragment;
002 import android.app.Activity;
003 import android.app.AlertDialog;
004 import android.app.Fragment;
005 import android.app.FragmentTransaction;
006 import android.app.ListFragment;
007 import android.os.Bundle;
008 import android.util.TypedValue;
009 import android.view.LayoutInflater;
010 import android.view.View;
011 import android.view.ViewGroup;
012 import android.widget.ArrayAdapter;
013 import android.widget.ListView;
014 import android.widget.ScrollView;
015 import android.widget.TextView;
016  
017 public class FragmentDemoActivity extends Activity {
018  
019     public static String[] array = { "text1,""text2""text3""text4",
020             "text5,""text6""text7""text8" };
021  
022     /** Called when the activity is first created. */
023     @Override
024     public void onCreate(Bundle savedInstanceState) {
025         super.onCreate(savedInstanceState);
026         setContentView(R.layout.main);
027     }
028  
029          
030     public static class TitlesFragment extends ListFragment {
031  
032         boolean mDualPane;
033         int mCurCheckPosition = 0;
034          
035         @Override
036         public void onCreate(Bundle savedInstanceState) {
037             // TODO Auto-generated method stub
038             super.onCreate(savedInstanceState);
039             System.out.println("Fragment-->onCreate");
040         }
041          
042         @Override
043         public View onCreateView(LayoutInflater inflater, ViewGroup container,
044                 Bundle savedInstanceState) {
045             // TODO Auto-generated method stub
046             System.out.println("Fragment-->onCreateView");
047             return super.onCreateView(inflater, container, savedInstanceState);
048         }
049          
050         @Override
051         public void onPause() {
052             // TODO Auto-generated method stub
053             super.onPause();
054             System.out.println("Fragment-->onPause");
055         }
056          
057          
058         @Override
059         public void onStop() {
060             // TODO Auto-generated method stub
061             super.onStop();
062              
063             System.out.println("Fragment-->onStop");
064         }
065          
066         @Override
067         public void onAttach(Activity activity) {
068             // TODO Auto-generated method stub
069             super.onAttach(activity);
070             System.out.println("Fragment-->onAttach");
071         }
072          
073         @Override
074         public void onStart() {
075             // TODO Auto-generated method stub
076             super.onStart();
077             System.out.println("Fragment-->onStart");
078         }
079          
080         @Override
081         public void onResume() {
082             // TODO Auto-generated method stub
083             super.onResume();
084             System.out.println("Fragment-->onResume");
085         }
086          
087         @Override
088         public void onDestroy() {
089             // TODO Auto-generated method stub
090             super.onDestroy();
091             System.out.println("Fragment-->onDestroy");
092         }
093          
094          
095  
096         @Override
097         public void onActivityCreated(Bundle savedInstanceState) {
098             // TODO Auto-generated method stub
099             super.onActivityCreated(savedInstanceState);
100             System.out.println("Fragment-->onActivityCreted");
101             setListAdapter(new ArrayAdapter<String>(getActivity(),
102                     android.R.layout.simple_list_item_1, array));
103  
104             View detailsFrame = getActivity().findViewById(R.id.details);
105  
106             mDualPane = detailsFrame != null
107                     && detailsFrame.getVisibility() == View.VISIBLE;
108  
109             if (savedInstanceState != null) {
110                 mCurCheckPosition = savedInstanceState.getInt("curChoice"0); //从保存的状态中取出数据
111             }
112  
113             if (mDualPane) {
114                 getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
115  
116                 showDetails(mCurCheckPosition);
117             }
118         }
119  
120         @Override
121         public void onSaveInstanceState(Bundle outState) {
122             // TODO Auto-generated method stub
123             super.onSaveInstanceState(outState);
124  
125             outState.putInt("curChoice", mCurCheckPosition);//保存当前的下标
126         }
127  
128         @Override
129         public void onListItemClick(ListView l, View v, int position, long id) {
130             // TODO Auto-generated method stub
131             super.onListItemClick(l, v, position, id);
132             showDetails(position);
133         }
134  
135         void showDetails(int index) {
136             mCurCheckPosition = index;
137             if (mDualPane) {
138                 getListView().setItemChecked(index, true);
139                 DetailsFragment details = (DetailsFragment) getFragmentManager()
140                         .findFragmentById(R.id.details);
141                 if (details == null || details.getShownIndex() != index) {
142                     details = DetailsFragment.newInstance(mCurCheckPosition);
143  
144                     //得到一个fragment 事务(类似sqlite的操作)
145                     FragmentTransaction ft = getFragmentManager()
146                             .beginTransaction();
147                     ft.replace(R.id.details, details);//将得到的fragment 替换当前的viewGroup内容,add则不替换会依次累加
148                     ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);//设置动画效果
149                     ft.commit();//提交
150                 }
151             else {
152                 new AlertDialog.Builder(getActivity()).setTitle(
153                         android.R.string.dialog_alert_title).setMessage(
154                         array[index]).setPositiveButton(android.R.string.ok,
155                         null).show();
156             }
157         }
158     }
159  
160     /**
161      * 作为界面的一部分,为fragment 提供一个layout
162      * @author terry
163      *
164      */
165     public static class DetailsFragment extends Fragment {
166  
167         public static DetailsFragment newInstance(int index) {
168             DetailsFragment details = new DetailsFragment();
169             Bundle args = new Bundle();
170             args.putInt("index", index);
171             details.setArguments(args);
172             return details;
173         }
174  
175         public int getShownIndex() {
176             return getArguments().getInt("index"0);
177         }
178  
179         @Override
180         public View onCreateView(LayoutInflater inflater, ViewGroup container,
181                 Bundle savedInstanceState) {
182             // TODO Auto-generated method stub
183             if (container == null)
184                 return null;
185  
186             ScrollView scroller = new ScrollView(getActivity());
187             TextView text = new TextView(getActivity());
188  
189             int padding = (int) TypedValue.applyDimension(
190                     TypedValue.COMPLEX_UNIT_DIP, 4, getActivity()
191                             .getResources().getDisplayMetrics());
192             text.setPadding(padding, padding, padding, padding);
193             scroller.addView(text);
194  
195             text.setText(array[getShownIndex()]);
196             return scroller;
197         }
198     }
199 }
注意:

如果你想在Fragment 里面创建menu,则必须在onCreate的时候设置让它可以存在optionMenu才可以创建,代码为:
1 public static class DetailsFragment extends Fragment {
2  
3         @Override
4         public void onCreate(Bundle savedInstanceState) {
5             // TODO Auto-generated method stub
6             super.onCreate(savedInstanceState);
7             setHasOptionsMenu(true);
8         }
9 }
之后的操作即可以像平常Android的menu用法一样,代码为:
01 @Override
02         public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
03             // TODO Auto-generated method stub
04             super.onCreateOptionsMenu(menu, inflater);
05              menu.add("Menu 1a").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
06                 menu.add("Menu 1b").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
07         }
08          
09         @Override
10         public boolean onOptionsItemSelected(MenuItem item) {
11             // TODO Auto-generated method stub
12             Toast.makeText(getActivity(), "index is"+getShownIndex()+" && menu text is "+item.getTitle(), 1000).show();
13             return super.onOptionsItemSelected(item);
14         }
更多详细的使用方法,请参考SDK和APIDEMO中相关的例子和解释。

DEMO下载:

Android FramentDEMO

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生就业服务平台管理系统按照操作主体分为管理员和用户。管理员的功能包括学生档案管理、字典管理、试卷管理、试卷选题管理、试题表管理、考试记录表管理、答题详情表管理、错题表管理、法律法规管理、法律法规收藏管理、法律法规留言管理、就业分析管理、论坛管理、企业管理、简历管理、老师管理、简历投递管理、新闻资讯管理、新闻资讯收藏管理、新闻资讯留言管理、学生信息管理、宣传管理、学生管理、职位招聘管理、职位收藏管理、招聘咨询管理、管理员管理。用户的功能等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 大学生就业服务平台管理系统可以提高大学生就业服务平台信息管理问题的解决效率,优化大学生就业服务平台信息处理流程,保证大学生就业服务平台信息数据的安全,它是一个非常可靠,非常安全的应用程序。 管理员权限操作的功能包括管理新闻信息,管理大学生就业服务平台信息,包括考试管理,培训管理,投递管理,薪资管理等,可以管理新闻信息。 考试管理界面,管理员在考试管理界面中可以对界面中显示,可以对考试信息的考试状态进行查看,可以添加新的考试信息等。投递管理界面,管理员在投递管理界面中查看投递种类信息,投递描述信息,新增投递信息等。新闻信息管理界面,管理员在新闻信息管理界面中新增新闻信息,可以删除新闻信息。新闻信息类型管理界面,管理员在新闻信息类型管理界面查看新闻信息的工作状态,可以对新闻信息的数据进行导出,可以添加新新闻信息的信息,可以编辑新闻信息信息,删除新闻信息信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值