Android tab页的实现

     马上要做毕业设计了,因为自己要做一个Android 方面的应用,所以将之前做的一个Android 项目中比较通用的功能抽取出来,巩固基础的同时可能还会帮助到可能需要的伙伴,何乐而不为。

     这是一个系列,首先是最长用到tab的实现。

     我在项目中使用的是RadioGroup+Fragment。

     其中,RadioGroup用来存放点击跳转的RadioButton

               

一,首先是布局的设计:

<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="vertical"
    tools:context=".MainActivity" >

    <!-- 用于存放Fragment的容器 -->

    <LinearLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="114" >
    </LinearLayout>
    <!-- 加条横线区分一下上面的Fragemnt容器和下面的导航按钮 -->
    <View
        android:layout_width="match_parent"
        android:layout_height="2dp"
        android:background="#ffff" />
    <!-- 用于存放Button切换的容器 -->

    <RadioGroup
        android:id="@+id/rgp_container"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="11"
        android:focusable="true"
        android:orientation="horizontal" >

        <!-- android:button="@null"这个属性是把RadioButton前面的圆圈去掉的,让它看起来更像普通的Button -->
        <!-- android:checked = "true"这个属性是设置该button默认被选中状态 -->

        <RadioButton
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:button="@null"
            android:checked="true"
            android:text="Fragment1" />

        <RadioButton
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Fragment2" />

        <RadioButton
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Fragment3" />
    </RadioGroup>

</LinearLayout>

二,为了方便管理Fragment  写了一个FragmentTabAdapter

package com.example.tabdemo;

import java.util.List;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;

/**
 * Fragment页面切换管理类,实现RadioGroup的OnCheckedChangeListener接口
 * 
 * @author Administrator
 * 
 */
public class FragmentTabAdapter implements OnCheckedChangeListener {
	private final String TAG = FragmentTabAdapter.class.getSimpleName();
	// 将Fragment放到集合中
	private List<Fragment> fragments;
	// 用于存放切换按钮的RadioGroup
	private RadioGroup rgs;
	// Fragment所属的Activity
	private FragmentActivity fragmentActivity;
	// Activity中所要被调换的区域的id
	private int fragmentContainerId;

	public FragmentTabAdapter(FragmentActivity fragmentActivity,
			List<Fragment> fragments, int fragmentContainerId, RadioGroup rgs) {
		this.fragmentActivity = fragmentActivity;
		this.fragments = fragments;
		this.fragmentContainerId = fragmentContainerId;
		this.rgs = rgs;
		// 默认显示第一页
		FragmentTransaction ft = fragmentActivity.getSupportFragmentManager()
				.beginTransaction();
		ft.add(fragmentContainerId, fragments.get(0));
		ft.commit();
		rgs.setOnCheckedChangeListener(this);// 注册RadioGroup监听事件
	}

	// 当前Tab页面的索引
	private int currentTab;

	@Override
	public void onCheckedChanged(RadioGroup group, int checkedId) {
		for (int i = 0; i < rgs.getChildCount(); i++) {
			if (rgs.getChildAt(i).getId() == checkedId) {
				Fragment fragment = fragments.get(i);
				FragmentTransaction ft = fragmentActivity
						.getSupportFragmentManager().beginTransaction();
				if (fragment.isAdded()) {
					fragment.onResume();// 启动目标tab的onResume()方法
				} else {
					ft.add(fragmentContainerId, fragment);
				}
				showTab(i);// 显示目标tab
				ft.commit();
			}
		}
	}

	/**
	 * 切换tab时显示相应的Fragment
	 * 
	 * @param i
	 */
	private void showTab(int index) {
		for (int i = 0; i < fragments.size(); i++) {
			Fragment fragment = fragments.get(i);
			FragmentTransaction ft = fragmentActivity
					.getSupportFragmentManager().beginTransaction();
			if (index == i) {
				ft.show(fragment);
			} else {
				ft.hide(fragment);
			}
			ft.commit();

		}
		currentTab = index;
	}

	/**
	 * 获取当前tab页的id
	 * 
	 * @return
	 */
	public int getCurrentTab() {
		return currentTab;
	}

	/**
	 * 获取当前Tab页中对应的Fragment
	 * 
	 * @return
	 */
	public Fragment getCurrentFragment() {
		return fragments.get(currentTab);
	}
}

三,在MainActivity调用FragmentTabAdapter

package com.example.tabdemo;

import java.util.ArrayList;
import java.util.List;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.view.Menu;
import android.widget.RadioGroup;

//因为用用到Fragment所以在此要继承FragmentActivity
public class MainActivity extends FragmentActivity {
	private final static String TAG = MainActivity.class.getSimpleName();
	private List<Fragment> fragments;
	private RadioGroup rgs;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		rgs = (RadioGroup) findViewById(R.id.rgp_container);
		fragments = new ArrayList<Fragment>();
		fragments.add(new Fragment1());
		fragments.add(new Fragment2());
		fragments.add(new Fragment3());
		new FragmentTabAdapter(this, fragments, R.id.container, rgs);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

四:至于怎么建Fragment和Framgnt一些基本知识,还请同学自己看下,这里就不错详细说明了,到此为止,tab页可以很好的实现了,是不是很简单啊。快动手试一试吧。

补充:

RadioButton和RadioGroup的关系:

1、RadioButton表示单个圆形单选框,而RadioGroup是可以容纳多个RadioButton的容器

2、每个RadioGroup中的RadioButton同时只能有一个被选中

3、不同的RadioGroup中的RadioButton互不相干,即如果组A中有一个选中了,组B中依然可以有一个被选中

4、大部分场合下,一个RadioGroup中至少有2个RadioButton

5、大部分场合下,一个RadioGroup中的RadioButton默认会有一个被选中,并建议您将它放在RadioGroup中的起始位置(android:focusable="true")



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值