Android UI详解之Fragment加载
fragment做为宿主activity UI的一部分, 被作为activity整个view hierarchy的一部分被嵌入. 有2种方法你可以添加一个fragment到activity layout:
一、在activity的layout文件中声明fragment
你可以像为View一样, 为fragment指定layout属性(sdk3.0以后).
例子是一个有2个fragment的activity:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
- <fragment android:name="com.example.news.ArticleListFragment"
- android:id="@+id/list"
- android:layout_weight="1"
- android:layout_width="0dp"
- android:layout_height="match_parent" />
- <fragment android:name="com.example.news.ArticleReaderFragment"
- android:id="@+id/viewer"
- android:layout_weight="2"
- android:layout_width="0dp"
- android:layout_height="match_parent" />
- </LinearLayout>
<fragment> 中的 android:name
属性指定了在layout中实例化的Fragment类.
当系统创建这个activity layout时,
它实例化每一个在layout中指定的fragment,并调用每一个上的onCreateView()方法,来获取每一个fragment的layout.
系统将从fragment返回的 View 直接插入到<fragment>元素所在的地方.
注意:
每一个fragment都需要一个唯一的标识,
如果activity重启,系统可以用来恢复fragment(并且你也可以用来捕获fragment来处理事务,例如移除它.)
有3种方法来为一个fragment提供一个标识:
为
android:id 属性提供一个唯一ID.
为 android:tag
属性提供一个唯一字符串.
如果以上2个你都没有提供,
系统使用容器view的ID.
二、使用FragmentManager将fragment添加到一个已存在的ViewGroup.
当activity运行的任何时候,
都可以将fragment添加到activity
layout.只需简单的指定一个需要放置fragment的ViewGroup.为了在你的activity中操作fragment事务(例如添加,移除,或代替一个fragment),必须使用来自
FragmentTransaction 的API.
可以按如下方法,从你的Activity取得一个
FragmentTransaction 的实例:
- FragmentManager fragmentManager = getFragmentManager();
- FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
然后你可以使用 add() 方法添加一个fragment, 指定要添加的fragment, 和要插入的view.
- ExampleFragment fragment = new ExampleFragment();
- fragmentTransaction.add(R.id.fragment_container, fragment);
- fragmentTransaction.commit();
add()的第一个参数是fragment要放入的ViewGroup, 由resource ID指定,
第二个参数是需要添加的fragment.一旦用FragmentTransaction做了改变,为了使改变生效,必须调用commit().
上一篇我们讲解了Fragment的加载方式,这次我们以一个实例来讲解:
布局:
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingBottom="@dimen/activity_vertical_margin"
- android:paddingLeft="@dimen/activity_horizontal_margin"
- android:paddingRight="@dimen/activity_horizontal_margin"
- android:paddingTop="@dimen/activity_vertical_margin"
- tools:context=".MainActivity" >
- <fragment class="com.xys.fragmentdemo.TitleFragment"
- android:id="@+id/titles"
- android:layout_weight="1"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- />
- <FrameLayout android:id="@+id/detials"
- android:layout_weight="1"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@android:color/darker_gray"></FrameLayout>
- </LinearLayout >
以上布局文件中使用了fragment标签和FrameLayout标签。Android Fragment使用
中介绍了2中嵌入Fragment的方法,这个实例中都用到,从布局文件看到有了fragment标签,这是一种使用方法,FrameLayout标签将会成为第二种加载fragment的载体view。
TitleFragment:
- package com.xys.fragmentdemo;
- import android.app.Fragment;
- import android.app.FragmentTransaction;
- import android.app.ListFragment;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.ArrayAdapter;
- import android.widget.ListView;
- public class TitleFragment extends ListFragment {
- public int currentChoosePosition=0;
- public int showChoosePosition=-1;
- @Override
- public void onListItemClick(ListView l, View v, int position, long id) {
- // TODO Auto-generated method stub
- showDetials(position);
- }
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onActivityCreated(savedInstanceState);
- setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_activated_1,Data.TitleData));
- if(savedInstanceState!=null){
- currentChoosePosition=savedInstanceState.getInt("currentChoose",0);
- showChoosePosition=savedInstanceState.getInt("showChoose",-1);
- }
- getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
- }
- @Override
- public void onSaveInstanceState(Bundle outState) {
- // TODO Auto-generated method stub
- super.onSaveInstanceState(outState);
- outState.putInt("currentChoose", currentChoosePosition);
- outState.putInt("showChoose", showChoosePosition);
- }
- public void showDetials(int index){
- currentChoosePosition=index;
- getListView().setItemChecked(index, true);
- if(showChoosePosition!=currentChoosePosition){
- //获取详情Fragment的实例
- DetialFragment df=DetialFragment.newInstance(index);
- //获取FragmentTransaction 实例
- FragmentTransaction ft=getFragmentManager().beginTransaction();
- //使用DetailsFragment 的实例
- ft.replace(R.id.detials, df);
- ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
- ft.commit();
- showChoosePosition=index;
- }
- }
- }
DetialFragment:
- package com.xys.fragmentdemo;
- import android.app.Fragment;
- import android.content.res.TypedArray;
- import android.os.Bundle;
- import android.util.TypedValue;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.ScrollView;
- import android.widget.TextView;
- //DetailsFragment 中使用newInstance(int index)方法产生DetailsFragment 实例并接受整型参数,重载了onCreateView方法创建view
- public class DetialFragment extends Fragment {
- public static DetialFragment newInstance(int index) {
- // TODO Auto-generated method stub
- DetialFragment df=new DetialFragment();
- Bundle bundle=new Bundle();
- bundle.putInt("index", index);
- df.setArguments(bundle);
- return df;
- }
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- if(container==null){
- return null;
- }
- ScrollView scrollView=new ScrollView(getActivity());
- TextView tv=new TextView(getActivity());
- int padding=(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4, getActivity().getResources().getDisplayMetrics());
- tv.setPadding(padding, padding, padding, padding);
- scrollView.addView(tv);
- tv.setText(Data.ContextData[getArguments().getInt("index",0)]);
- return scrollView;
- }
- }
Data:
- package com.xys.fragmentdemo;
- public class Data {
- public static final String TitleData[]={"Title1","Title2","Title3","Title4","Title5"};
- public static final String ContextData[]={"Context1","Context2","Context3","Context4","Context5"};
- }
国际惯例 上效果图:
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。