Android笔记(六十八) Fragment总结

Fragment的产生:

为了适应各种尺寸的屏幕,谷歌推出Fragment,可以把Fragment成Activity的一个组成部分,它拥有自己的生命周期、可以接收并处理用户的各种事件,还可以动态的增删改某个Fragment

Fragment的使用

可以把Fragment当成普通的控件使用,直接写在布局文件中,然后新建一个继承自Fragment的类加载这个布局,然后在Activity的布局文件中直接引用这个Fragment,就是这么简单:

MainActivity.java

package com.example.fragmentdemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);

    }
}

activity_main.xml

<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:orientation="horizontal"
    tools:context="com.example.fragmentdemo.MainActivity" >

    <fragment
        android:id="@+id/fragment1"
        android:name="com.example.fragmentdemo.fragment.Fragment1"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_weight="1" />

    <fragment
        android:id="@+id/fragment2"
        android:name="com.example.fragmentdemo.fragment.Fragment2"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_weight="1" />

</LinearLayout>

Fragment1.java

package com.example.fragmentdemo.fragment;

import com.example.fragmentdemo.R;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Fragment1 extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment1, container, false);

        return view;
    }

}

fragment1.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="vertical" >

    <TextView
        android:id="@+id/text1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#DDA0DD"
        android:text="这是Fragment1" />

</LinearLayout>

Fragment2.java

package com.example.fragmentdemo.fragment;

import com.example.fragmentdemo.R;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Fragment2 extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        return inflater.inflate(R.layout.fragment2, container, false);
    }

}

fragment2.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:background="#7B68EE"
    android:orientation="vertical" >

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="这是Fragment2" />

</LinearLayout>

运行结果:

      动态使用Fragment

动态使用Fragment需要以下几个步骤:

1.获取到FragmentManager,在Activity中可以直接通过getFragmentManager得到。

2.开启一个事务,通过调用beginTransaction方法开启。

3.使用add(),replace(),remove(),hide(),show(),detach(),attach()等方法编辑Fragment

add()——往Activity中添加一个Fragment

replace()——使用另外一个Fragment替换当前的Fragment

remove()——移除一个Fragment

hide()——隐藏一个Fragment

show()——将隐藏的Fragment显示

detach()——会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护。

attach()——重建View视图,附加到UI上并显示

4.提交事务,调用commit方法提交。

实现微信地步菜单:

MainActivity.java

package cn.lixyz.test;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import cn.lixyz.test.fragment.DiscoverFragment;
import cn.lixyz.test.fragment.MeFragment;
import cn.lixyz.test.fragment.TXLFragment;
import cn.lixyz.test.fragment.WeChatFragment;

public class MainActivity extends Activity implements OnCheckedChangeListener {

    private RadioGroup rg_tab_buttons;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);

        getFragmentManager().beginTransaction().add(R.id.layout, new WeChatFragment(), "wechat").commit();
        rg_tab_buttons = (RadioGroup) findViewById(R.id.rg_tab_buttons);
        rg_tab_buttons.setOnCheckedChangeListener(this);

    }

    @Override
    public void onCheckedChanged(RadioGroup group, int checkedId) {
        switch (checkedId) {
        case R.id.rb_wechat:
            getFragmentManager().beginTransaction().replace(R.id.layout, new WeChatFragment(), "wechat").commit();
            break;
        case R.id.rb_txl:
            getFragmentManager().beginTransaction().replace(R.id.layout, new TXLFragment(), "txl").commit();
            break;
        case R.id.rb_discover:
            getFragmentManager().beginTransaction().replace(R.id.layout, new DiscoverFragment(), "discover").commit();
            break;
        case R.id.rb_me:
            getFragmentManager().beginTransaction().replace(R.id.layout, new MeFragment(), "me").commit();
            break;
        }
    }

}

activity_main.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:background="#f9f9f9"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:orientation="vertical" >
    </LinearLayout>

    <RadioGroup
        android:id="@+id/rg_tab_buttons"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1" />

        <RadioButton
            android:id="@+id/rb_wechat"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/wechat_icon"
            android:button="@null" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1" />

        <RadioButton
            android:id="@+id/rb_txl"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/txl_icon"
            android:button="@null" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1" />

        <RadioButton
            android:id="@+id/rb_discover"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/discover_icon"
            android:button="@null" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1" />

        <RadioButton
            android:id="@+id/rb_me"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/me_icon"
            android:button="@null" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1" />
    </RadioGroup>

</LinearLayout>

DiscoverFragment.java

package cn.lixyz.test.fragment;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import cn.lixyz.test.R;

public class DiscoverFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.discover_fragment, container, false);
    }

}

discover_fragment.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="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这是发现页面" />

</LinearLayout>

MeFragment.java

package cn.lixyz.test.fragment;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import cn.lixyz.test.R;

public class MeFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.me_fragment, container, false);
    }

}

me_fragment.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="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这是我页面" />

</LinearLayout>

TXLFragment.java

package cn.lixyz.test.fragment;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import cn.lixyz.test.R;

public class TXLFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.txl_fragment, container, false);
    }

}

txl_fragment.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="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这是通讯录页面" />

</LinearLayout>

WeChatFragment.java

package cn.lixyz.test.fragment;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import cn.lixyz.test.R;

public class WeChatFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.wechat_fragment, container, false);
    }

}

wechat_fragment.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="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这是微信页面" />

</LinearLayout>

  运行结果:

Fragment的生命周期

和Activity一样,Fragment同样也拥有自己的生命周期

package com.example.fragmentdemo.fragment;

import com.example.fragmentdemo.R;

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Fragment1 extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        Log.d("TTTT", "onCreateView方法运行了...");
        return inflater.inflate(R.layout.fragment1, container, false);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        Log.d("TTTT", "onAttach方法运行了...");
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("TTTT", "onCreate方法运行了...");
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Log.d("TTTT", "onActivityCreated方法运行了...");
    }

    @Override
    public void onStart() {
        super.onStart();
        Log.d("TTTT", "onStart方法运行了...");
    }

    @Override
    public void onResume() {
        super.onResume();
        Log.d("TTTT", "onResume方法运行了...");
    }

    @Override
    public void onPause() {
        super.onPause();
        Log.d("TTTT", "onPause方法运行了...");
    }

    @Override
    public void onStop() {
        super.onStop();
        Log.d("TTTT", "onStop方法运行了...");
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        Log.d("TTTT", "onDestroyView方法运行了...");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d("TTTT", "onDestroy方法运行了...");
    }

    @Override
    public void onDetach() {
        super.onDetach();
        Log.d("TTTT", "onDetach方法运行了...");
    }

}

      运行程序

12-29 12:12:29.490: D/TTTT(8133): onAttach方法运行了...
12-29 12:12:29.490: D/TTTT(8133): onCreate方法运行了...
12-29 12:12:29.490: D/TTTT(8133): onCreateView方法运行了...
12-29 12:12:29.490: D/TTTT(8133): onActivityCreated方法运行了...
12-29 12:12:29.491: D/TTTT(8133): onStart方法运行了...
12-29 12:12:29.491: D/TTTT(8133): onResume方法运行了...

  按HOME键回到桌面

12-29 12:13:17.164: D/TTTT(8133): onPause方法运行了...
12-29 12:13:17.793: D/TTTT(8133): onStop方法运行了...

  再次进入程序

12-29 12:13:38.604: D/TTTT(8133): onStart方法运行了...
12-29 12:13:38.604: D/TTTT(8133): onResume方法运行了...

  退出程序

12-29 12:13:55.785: D/TTTT(8133): onPause方法运行了...
12-29 12:13:56.464: D/TTTT(8133): onStop方法运行了...
12-29 12:13:56.464: D/TTTT(8133): onDestroyView方法运行了...
12-29 12:13:56.464: D/TTTT(8133): onDestroy方法运行了...
12-29 12:13:56.464: D/TTTT(8133): onDetach方法运行了...

看到这里,我相信大多数朋友已经非常明白了,因为这和Activity的生命周期太相似了。只是有几个Activity中没有的新方法,这里需要重点介绍一下:

onAttach方法:Fragment和Activity建立关联的时候调用。

onCreateView方法:为Fragment加载布局时调用。

onActivityCreated方法:当Activity中的onCreate方法执行完后调用。

onDestroyView方法:Fragment中的布局被移除时调用。

onDetach方法:Fragment和Activity解除关联的时候调用。

时间: 2024-10-01 08:09:27

Android笔记(六十八) Fragment总结的相关文章

Android笔记(六十二)网络框架volley

什么是Volley 很多时候,我们的APP都需要用到网络技术,使用HTTP协议来发送接收数据,谷歌推出了一个网络框架——volley,该框架适合进行数据量不大,但通信频繁的网络操作. 它的优点: (1)默认Android2.3及以上基于HttpURLConnection,2.3以下使用基于HttpClient: (2)符合Http 缓存语义 的缓存机制(提供了默认的磁盘和内存等缓存): (3)请求队列的优先级排序: (4)提供多样的取消机制: (5)提供简便的图片加载工具(其实图片的加载才是我们

Android笔记(六十五) android中的动画——属性动画(propertyanimation)

补间动画只能定义起始和结束两个帧在“透明度”.“旋转”.“倾斜”.“位移”4个方面的变化,逐帧动画也只能是播放多个图片,无法满足我们日常复杂的动画需求,所以谷歌在3.0开始,推出了属性动画(property animation) 属性动画已经不再是针对View来设计的了,也不仅限定于只能实现移动.缩放.淡入淡出这几种动画操作,同时也不再是一种视觉上的动画效果了.它实际上是一种不断的对值进行操作的机制,并将值赋值到指定对象的指定属性上,可以是任意对象的任意属性. ValueAnimator Val

Android笔记(六十四) android中的动画——补间动画(tweened animation)

补间动画就是只需要定义动画开始和结束的位置,动画中间的变化由系统去补齐. 补间动画由一下四种方式: 1.AplhaAnimation——透明度动画效果 2.ScaleAnimation ——缩放动画效果 3.TranslateAnimation——位移动画效果 4.RotateAnimation——旋转动画效果 1.AplhaAnimation AplhaAnimation的参数: fromAlpha:动画开始时的透明度,0.0表示完全透明 toAlpha:动画结束时的透明度,1.0表示完全不透

Android笔记(六十六) android中的动画——XML文件定义属性动画

除了直接在java代码中定义动画之外,还可以使用xml文件定义动画,以便重用. 如果想要使用XML来编写动画,首先要在res目录下面新建一个animator文件夹,所有属性动画的XML文件都应该存放在这个文件夹当中.然后在XML文件中我们一共可以使用如下三种标签: <animator>  对应代码中的ValueAnimator <objectAnimator>  对应代码中的ObjectAnimator <set>  对应代码中的AnimatorSet 使用XML设置动

Android笔记二十八.Android绘图深度解析

Android绘图深度解析 转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) Android绘图方法主要有两个步骤: (1)实现一个继承于View组件的类,并重写它的onDraw(Canavas canvas)方法; (2)显示定义的View子类,有两种方法:a.使用一个Activity来显示View子类,即 setContentView(new MyView(this, null));b.在Acitviy的布局文件中增加"包名.View子类&

Android学习笔记(十八)——使用意图筛选器和实现浏览网页(附源码)

使用意图筛选器 点击下载源码 1.创建一个Intents项目,给该项目添加一个新类,命名为MyBrowserActivity,在res/layout文件夹下新增一个browser.xml: 2.在AndroidManifest.xml文件中添加如下代码: 添加权限: <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="a

48. 蛤蟆的数据结构笔记之四十八的有向无环图的应用关键路径

48. 蛤蟆的数据结构笔记之四十八的有向无环图的应用关键路径 本篇名言:"富贵不淫贫贱乐 ,男儿到此是豪雄.-- 程颢" 这次来看下有向无环图的另一个应用关键路径. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47135061 1.  关键路径 与AOV-网相对应的是AOE-网(Activity On Edge)即边表示活动的网.AOE-网是一个带权的有向无环图,其中,顶点表示事件(Event),弧表示活动,权表

【Unity 3D】学习笔记二十八:unity工具类

unity为开发者提供了很多方便开发的工具,他们都是由系统封装的一些功能和方法.比如说:实现时间的time类,获取随机数的Random.Range( )方法等等. 时间类 time类,主要用来获取当前的系统时间. using UnityEngine; using System.Collections; public class Script_04_13 : MonoBehaviour { void OnGUI() { GUILayout.Label("当前游戏时间:" + Time.t

angular学习笔记(二十八)-$http(6)-使用ngResource模块构建RESTful架构

ngResource模块是angular专门为RESTful架构而设计的一个模块,它提供了'$resource'模块,$resource模块是基于$http的一个封装.下面来看看它的详细用法 1.引入angular-resource.min.js文件 2.在模块中依赖ngResourece,在服务中注入$resource var HttpREST = angular.module('HttpREST',['ngResource']); HttpREST.factory('cardResource