Fragment切换的演示

首先创建主布局文件,即activity_main.xml,代码如下
<RelativeLayout 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="com.example.day17_fragment.MainActivity" >

    <RadioGroup
        android:id="@+id/rg_btns"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:gravity="center"
        android:orientation="horizontal" >

        <RadioButton
            android:id="@+id/btn_menu1"
            style="@style/radiobutton"
            android:tag="1"
            android:drawableTop="@drawable/menu1"
            android:text="礼物" />

        <RadioButton
            android:id="@+id/btn_menu2"
            style="@style/radiobutton"
            android:tag="2"
            android:drawableTop="@drawable/menu2"
            android:text="朋友圈" />

        <RadioButton
            android:id="@+id/btn_menu5"
            style="@style/radiobutton"
            android:tag="5"
            android:drawableTop="@drawable/menu5"
            android:text="游戏"/>


        <RadioButton
            android:id="@+id/btn_menu3"
            style="@style/radiobutton"
            android:tag="3"
            android:drawableTop="@drawable/menu3"
           android:text="个人" />

        <RadioButton
            android:id="@+id/btn_menu4"
            style="@style/radiobutton"
            android:tag="4"
            android:drawableTop="@drawable/menu4"
           android:text="赚钱"/>
    </RadioGroup> <FrameLayout android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@id/rg_btns"></FrameLayout> </RelativeLayout>
这里使用了RadioButton进行界面的切换,相同属性值我都写在样式里了,这里只是引用一下,这不是重点.在按钮上方使用了FrameLayout作为Fragment的容器,为什么使用帧布局呢,毕竟方便.

其次,创建五个Fragment布局,差不多的布局,我就写一个了.以下是代码:
<?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/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="第1个fragment" />

</LinearLayout>
这里的textview只是为了区分不同的Fragment.

布局文件创建好了,我们开始写代码了.

首先创建自己的Fragment类,如:FristFragment,然后继承Fragment.导包不要导错,我是用的v4兼容包.
以下是Fragment类的代码:

package com.example.day17_fragment;

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

public class FirstFragment extends Fragment{
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        return inflater.inflate(R.layout.firstfragment,container,false);
    }
}
这是第一个Fragment的代码,剩下的基本都是一样的步骤.就是onCreateView方法的返回值中,将R.layout.firstfragment替换成你的其他Fragment的布局文件.就不罗嗦了.

在所有的自定义的Fragment类都写好了后,开始写MainActivity了,以下是代码:
package com.example.day17_fragment;

import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.FrameLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;

public class MainActivity extends FragmentActivity {
    private RadioGroup rg_btns;
    private FragmentManager fm = getSupportFragmentManager();
    private Fragment fir, sec, thri, forth, fif;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initList();
        //默认显示的fragment
        selectBtn(R.id.btn_menu5);

        rg_btns.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {         
                selectBtn(checkedId);
            }
        });
    }
    //通过按钮选择对应的Fragment
    private void selectBtn(int checkedId) {
        FragmentTransaction ft = fm.beginTransaction();
        isNull(ft);
        switch (checkedId) {
        case R.id.btn_menu5:
            // 主页
            if (fif == null) {
                fif = new FifthFragment();
                ft.add(R.id.content, fif);
            } else {
                ft.show(fif);
            }
            break;
        case R.id.btn_menu1:
            if (fir == null) {
                fir = new FirstFragment();
                ft.add(R.id.content, fir);
            } else {
                ft.show(fir);
            }
            break;
        case R.id.btn_menu2:
            if (sec == null) {
                sec = new SecondFragment();
                ft.add(R.id.content, sec);
            } else {
                ft.show(sec);
            }
            break;
        case R.id.btn_menu3:
            if (thri == null) {
                thri = new ThridFragment();
                ft.add(R.id.content, thri);
            } else {
                ft.show(thri);
            }
            break;
        case R.id.btn_menu4:
            if (forth == null) {
                forth = new ForthFragemnt();
                ft.add(R.id.content, forth);
            } else {
                ft.show(forth);
            }
            break;

        default:
            break;
        }
        //别忘了,要commit.千万别忘了
        ft.commit();
    }
    private void isNull(FragmentTransaction ft) {
        if (fif != null) {
            ft.hide(fif);
        }
        if (fir != null) {
            ft.hide(fir);
        }
        if (sec != null) {
            ft.hide(sec);
        }
        if (thri != null) {
            ft.hide(thri);
        }
        if (forth != null) {
            ft.hide(forth);
        }
    }


//初始化控件,虽然只有一个,但还是要养成这样的习惯.
    private void initView() {
        rg_btns = (RadioGroup) findViewById(R.id.rg_btns);
    }
}
在MainActivity中,首先是初始化控件.设置RadioGroup的监听事件,然后通过对应的按钮找到对应的Fragment,是不是很简单.就是选择Fragment的代码多了一些.我加了很多判断Fragment的判断是为了优化代码,判断Fragment是否为null,这样才会在点击按钮之后再创建,不然在布局加载的时候都创建了,我又不用不就浪费了么.Last but not least,别导错包,v4包,所以因为导的是v4包,这里的MainActivity就不能继承Activity了,要继承FragmentActivity.这是容易遗漏的地方.

然后代码貌似还是很多很不爽,就想了一个可以减少代码的方式.先给看一下减少后的代码:
package com.example.day17_fragment;

import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.FrameLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;

public class MainActivity extends FragmentActivity {
    private RadioGroup rg_btns;
    private FragmentManager fm = getSupportFragmentManager();
    private Fragment fir, sec, thri, forth, fif;
    private List<Fragment> list = new ArrayList<Fragment>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        //默认显示
        fm.beginTransaction().add(R.id.content, list.get(4)).commit();
        rg_btns.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {

                RadioButton rb = (RadioButton) group.findViewById(checkedId);
                int num = Integer.parseInt(rb.getTag().toString())-1;
                fm.beginTransaction().replace(R.id.content, list.get(num)).commit(); 
            }       
        });
    }
    //将Fragment对象加入集合中
    private void initList() {
        list.add(new FirstFragment());
        list.add(new SecondFragment());
        list.add(new ThridFragment());
        list.add(new ForthFragemnt());
        list.add(new FifthFragment());
    }
    //初始化控件
    private void initView() {
        rg_btns = (RadioGroup) findViewById(R.id.rg_btns);
    }

}

这里使用了一个集合来存储Fragment对象,然后在RadioGroup的监听事件里通过CheckedId来查找RadioButton,获得对应的Tag属性值(还记得我在主布局RadioButton中的Tag属性么,就是为此特意加的),作为集合的索引.这里的方法是笨方法.代码灵活性较差,但毕竟能减少这么多代码,况且Fragment的数量屈指可数,便也就无伤大雅了.
以下图片是最终效果:
Fragment切换的演示_第1张图片Fragment切换的演示_第2张图片Fragment切换的演示_第3张图片Fragment切换的演示_第4张图片Fragment切换的演示_第5张图片
好吧,这其实就是我的家庭作业,顺便整理一下,作为我的第一个技术博文吧.

你可能感兴趣的:(android,Fragment)