Android fragment使用详解及案例

移动开发 Android
自从Android 3.0中引入fragments 的概念,根据词海的翻译可以译为:碎片、片段。其上的是为了解决不同屏幕分辩率的动态和灵活UI设计。大屏幕如平板小屏幕如手机,平板电脑的设计使得其有更多的空间来放更多的UI组件,而多出来的空间存放UI使其会产生更多的交互,从而诞生了fragments 。

Fragment 设计理念

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

 

Fragment的生命周期 

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

 

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

onCreate

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

onCreateView

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

onPause 

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

Fragment 的类别

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

DialogFragment

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

ListFragments

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

PreferenceFragments

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

Fragment 的详细使用 

首先先来看一张DEMO 效果图:

 

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

相就的XML文件:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" > 
 
   <fragment class="com.xuzhi.fragment.FragmentDemoActivity$TitlesFragment" android:id="@+id/titles" android:layout_weight="1" 
       android:layout_width="0px" android:layout_height="match_parent" 
       /> 
    
   <FrameLayout android:id="@+id/details" android:layout_weight="1" android:layout_width="0px" android:layout_height="match_parent" 
       android:background="?android:attr/detailsElementBackground" 
       ></FrameLayout> 
</LinearLayout> 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

主界面代码(己做注释):

package com.xuzhi.fragment; 
import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.Fragment; 
import android.app.FragmentTransaction; 
import android.app.ListFragment; 
import android.os.Bundle; 
import android.util.TypedValue; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.ScrollView; 
import android.widget.TextView; 
 
public class FragmentDemoActivity extends Activity { 
 
    public static String[] array = { "text1,""text2""text3""text4"
            "text5,""text6""text7""text8" }; 
 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main); 
    } 
 
         
    public static class TitlesFragment extends ListFragment { 
 
        boolean mDualPane; 
        int mCurCheckPosition = 0
         
        @Override 
        public void onCreate(Bundle savedInstanceState) { 
            // TODO Auto-generated method stub 
            super.onCreate(savedInstanceState); 
            System.out.println("Fragment-->onCreate"); 
        } 
         
        @Override 
        public View onCreateView(LayoutInflater inflater, ViewGroup container, 
                Bundle savedInstanceState) { 
            // TODO Auto-generated method stub 
            System.out.println("Fragment-->onCreateView"); 
            return super.onCreateView(inflater, container, savedInstanceState); 
        } 
         
        @Override 
        public void onPause() { 
            // TODO Auto-generated method stub 
            super.onPause(); 
            System.out.println("Fragment-->onPause"); 
        } 
         
         
        @Override 
        public void onStop() { 
            // TODO Auto-generated method stub 
            super.onStop(); 
             
            System.out.println("Fragment-->onStop"); 
        } 
         
        @Override 
        public void onAttach(Activity activity) { 
            // TODO Auto-generated method stub 
            super.onAttach(activity); 
            System.out.println("Fragment-->onAttach"); 
        } 
         
        @Override 
        public void onStart() { 
            // TODO Auto-generated method stub 
            super.onStart(); 
            System.out.println("Fragment-->onStart"); 
        } 
         
        @Override 
        public void onResume() { 
            // TODO Auto-generated method stub 
            super.onResume(); 
            System.out.println("Fragment-->onResume"); 
        } 
         
        @Override 
        public void onDestroy() { 
            // TODO Auto-generated method stub 
            super.onDestroy(); 
            System.out.println("Fragment-->onDestroy"); 
        } 
         
         
 
        @Override 
        public void onActivityCreated(Bundle savedInstanceState) { 
            // TODO Auto-generated method stub 
            super.onActivityCreated(savedInstanceState); 
            System.out.println("Fragment-->onActivityCreted"); 
            setListAdapter(new ArrayAdapter<String>(getActivity(), 
                    android.R.layout.simple_list_item_1, array)); 
 
            View detailsFrame = getActivity().findViewById(R.id.details); 
 
            mDualPane = detailsFrame != null 
                    && detailsFrame.getVisibility() == View.VISIBLE; 
 
            if (savedInstanceState != null) { 
                mCurCheckPosition = savedInstanceState.getInt("curChoice"0); //从保存的状态中取出数据 
            } 
 
            if (mDualPane) { 
                getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
 
                showDetails(mCurCheckPosition); 
            } 
        } 
 
        @Override 
        public void onSaveInstanceState(Bundle outState) { 
            // TODO Auto-generated method stub 
            super.onSaveInstanceState(outState); 
 
            outState.putInt("curChoice", mCurCheckPosition);//保存当前的下标 
        } 
 
        @Override 
        public void onListItemClick(ListView l, View v, int position, long id) { 
            // TODO Auto-generated method stub 
            super.onListItemClick(l, v, position, id); 
            showDetails(position); 
        } 
 
        void showDetails(int index) { 
            mCurCheckPosition = index;  
            if (mDualPane) { 
                getListView().setItemChecked(index, true); 
                DetailsFragment details = (DetailsFragment) getFragmentManager() 
                        .findFragmentById(R.id.details);  
                if (details == null || details.getShownIndex() != index) { 
                    details = DetailsFragment.newInstance(mCurCheckPosition);  
 
                    //得到一个fragment 事务(类似sqlite的操作) 
                    FragmentTransaction ft = getFragmentManager() 
                            .beginTransaction(); 
                    ft.replace(R.id.details, details);//将得到的fragment 替换当前的viewGroup内容,add则不替换会依次累加 
                    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);//设置动画效果 
                    ft.commit();//提交 
                } 
            } else { 
                new AlertDialog.Builder(getActivity()).setTitle( 
                        android.R.string.dialog_alert_title).setMessage( 
                        array[index]).setPositiveButton(android.R.string.ok, 
                        null).show(); 
            } 
        } 
    } 
 
    /** 
     * 作为界面的一部分,为fragment 提供一个layout 
     * @author terry 
     * 
     */ 
    public static class DetailsFragment extends Fragment { 
 
        public static DetailsFragment newInstance(int index) {  
            DetailsFragment details = new DetailsFragment(); 
            Bundle args = new Bundle(); 
            args.putInt("index", index); 
            details.setArguments(args); 
            return details; 
        } 
 
        public int getShownIndex() { 
            return getArguments().getInt("index"0); 
        } 
 
        @Override 
        public View onCreateView(LayoutInflater inflater, ViewGroup container, 
                Bundle savedInstanceState) { 
            // TODO Auto-generated method stub 
            if (container == null
                return null
 
            ScrollView scroller = new ScrollView(getActivity()); 
            TextView text = new TextView(getActivity()); 
 
            int padding = (int) TypedValue.applyDimension( 
                    TypedValue.COMPLEX_UNIT_DIP, 4, getActivity() 
                            .getResources().getDisplayMetrics()); 
            text.setPadding(padding, padding, padding, padding); 
            scroller.addView(text); 
 
            text.setText(array[getShownIndex()]); 
            return scroller; 
        } 
    } 

 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
  • 141.
  • 142.
  • 143.
  • 144.
  • 145.
  • 146.
  • 147.
  • 148.
  • 149.
  • 150.
  • 151.
  • 152.
  • 153.
  • 154.
  • 155.
  • 156.
  • 157.
  • 158.
  • 159.
  • 160.
  • 161.
  • 162.
  • 163.
  • 164.
  • 165.
  • 166.
  • 167.
  • 168.
  • 169.
  • 170.
  • 171.
  • 172.
  • 173.
  • 174.
  • 175.
  • 176.
  • 177.
  • 178.
  • 179.
  • 180.
  • 181.
  • 182.
  • 183.
  • 184.
  • 185.
  • 186.
  • 187.
  • 188.
  • 189.
  • 190.
  • 191.
  • 192.
  • 193.
  • 194.
  • 195.
  • 196.
  • 197.
  • 198.
  • 199.
  • 200.

注意:

  1. 如果你想在Fragment 里面创建menu,则必须在onCreate的时候设置让它可以存在optionMenu才可以创建,代码为:
public static class DetailsFragment extends Fragment { 
 
        @Override 
        public void onCreate(Bundle savedInstanceState) { 
            // TODO Auto-generated method stub 
            super.onCreate(savedInstanceState); 
            setHasOptionsMenu(true); 
        } 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

之后的操作即可以像平常Android的menu用法一样,代码为:

@Override 
        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
            // TODO Auto-generated method stub 
            super.onCreateOptionsMenu(menu, inflater); 
             menu.add("Menu 1a").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 
                menu.add("Menu 1b").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 
        } 
         
        @Override 
        public boolean onOptionsItemSelected(MenuItem item) { 
            // TODO Auto-generated method stub 
            Toast.makeText(getActivity(), "index is"+getShownIndex()+" && menu text is "+item.getTitle(), 1000).show(); 
            return super.onOptionsItemSelected(item); 
        } 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
责任编辑:张叶青 来源: 博客园
相关推荐

2009-08-03 11:38:57

linux at命令详linux at命令

2018-07-12 15:03:41

2016-12-02 19:00:13

Android FraAndroid

2014-07-21 10:12:00

FragmentiewPagerIndcsdn app

2010-06-24 11:16:17

Linux Cat命令详解

2010-06-01 16:46:38

Rsync 命令

2010-02-03 15:59:08

Android组件

2010-01-28 10:31:32

Android使用SD

2019-07-24 05:36:25

物联网设备物联网IOT

2013-06-04 17:23:55

Android开发移动开发Fragment

2021-09-29 06:03:37

JavaScriptreduce() 前端

2009-07-31 17:51:42

linux vi命令详linux vi命令编辑器

2017-02-17 11:50:18

AndroidBitmap缓存池

2011-09-13 17:03:16

Eclipse And

2018-03-29 08:38:10

2023-07-03 15:55:05

语法jpa状态

2009-08-14 09:27:27

C#构造函数的特性

2012-04-06 10:44:02

2023-11-10 08:17:01

分布式搜索引擎

2025-01-20 07:00:00

点赞
收藏

51CTO技术栈公众号