马上要做毕业设计了,因为自己要做一个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")