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解除关联的时候调用。

原文地址:https://www.cnblogs.com/xs104/p/5079351.html