Android利用Fragment实现Tab选项卡效果

利用Fragment实现Tab选项卡效果:

将RadioGroup与Fragment集合,实现tab选项卡效果,这里面最关键的几个文件:

1.FragmentTabAdapter类:

/** *@Description: *@Author:Nate Robinson *@Since:2015-2-12 */ public class FragmentTabAdapter implements RadioGroup.OnCheckedChangeListener { private List<Fragment> fragments; // 一个tab页面对应一个Fragment private RadioGroup rgs; // 用于切换tab private Activity activity; // Fragment所属的Activity private int fragmentContentId; // Activity中所要被替换的区域的id private int currentTab; // 当前Tab页面索引 private OnRgsExtraCheckedChangedListener onRgsExtraCheckedChangedListener; // 用于让调用者在切换tab时候增加新的功能 public FragmentTabAdapter(Activity activity, List<Fragment> fragments, int fragmentContentId, RadioGroup rgs) { this.fragments = fragments; this.rgs = rgs; this.activity = activity; this.fragmentContentId = fragmentContentId; // 默认显示第一页 android.app.FragmentTransaction ft = activity.getFragmentManager().beginTransaction(); ft.add(fragmentContentId, fragments.get(0)); ft.commit(); rgs.setOnCheckedChangeListener(this); } @Override public void onCheckedChanged(RadioGroup radioGroup, int checkedId) { for(int i = 0; i < rgs.getChildCount(); i++) { if(rgs.getChildAt(i).getId() == (checkedId)) { Fragment fragment = fragments.get(i); FragmentTransaction ft = activity.getFragmentManager().beginTransaction(); getCurrentFragment().onPause(); // 暂停当前tab // getCurrentFragment().onStop(); // 暂停当前tab if(fragment.isAdded()) { // fragment.onStart(); // 启动目标tab的onStart() fragment.onResume(); // 启动目标tab的onResume() } else { ft.add(fragmentContentId, fragment); } showTab(i); // 显示目标tab ft.commit(); // 如果设置了切换tab额外功能功能接口 if(null != onRgsExtraCheckedChangedListener) { onRgsExtraCheckedChangedListener.OnRgsExtraCheckedChanged(radioGroup, checkedId, i); } } } } /** * 切换tab * @param idx */ private void showTab(int idx) { for(int i = 0; i < fragments.size(); i++) { Fragment fragment = fragments.get(i); FragmentTransaction ft = activity.getFragmentManager().beginTransaction(); if(idx == i) { ft.show(fragment); } else { ft.hide(fragment); } ft.commit(); } currentTab = idx; // 更新目标tab为当前tab } public int getCurrentTab() { return currentTab; } public Fragment getCurrentFragment() { return fragments.get(currentTab); } public OnRgsExtraCheckedChangedListener getOnRgsExtraCheckedChangedListener() { return onRgsExtraCheckedChangedListener; } public void setOnRgsExtraCheckedChangedListener(OnRgsExtraCheckedChangedListener onRgsExtraCheckedChangedListener) { this.onRgsExtraCheckedChangedListener = onRgsExtraCheckedChangedListener; } /** * 切换tab额外功能功能接口 */ public interface OnRgsExtraCheckedChangedListener { void OnRgsExtraCheckedChanged(RadioGroup radioGroup, int checkedId, int index); } }

2.activity_main.xml布局文件:

<?xml version="1.0" encoding="UTF-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@android:color/white" android:orientation="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <FrameLayout android:id="@+id/tab_content" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1.0" android:background="#77557799" /> <RadioGroup android:id="@+id/tabs_rg" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:orientation="horizontal" android:paddingBottom="7dp" android:paddingTop="7dp" > <RadioButton android:id="@+id/tab_rb_a" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1.0" android:background="@drawable/selector_tab" android:button="@null" android:checked="true" android:drawableTop="@drawable/tablatestalert" android:gravity="center" android:singleLine="true" android:text="Tab1" android:textColor="#000000" android:textSize="13sp" /> <RadioButton android:id="@+id/tab_rb_b" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1.0" android:background="@drawable/selector_tab" android:button="@null" android:drawableTop="@drawable/tabsearch" android:gravity="center" android:singleLine="true" android:text="Tab2" android:textColor="#000000" android:textSize="13sp" /> <RadioButton android:id="@+id/tab_rb_c" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1.0" android:background="@drawable/selector_tab" android:button="@null" android:drawableTop="@drawable/tabrecommd" android:gravity="center" android:singleLine="true" android:text="Tab3" android:textColor="#000000" android:textSize="13sp" /> </RadioGroup> </LinearLayout> </LinearLayout>

3.MainActivity类:

/** *@Description: *@Author:Nate Robinson *@Since:2015-2-12 */ public class MainActivity extends Activity { private RadioGroup rgs; private List<Fragment> fragments = new ArrayList<Fragment>(); private int index; private static Boolean isExit = false; private static Boolean hasTask = false; private RadioButton button; private Timer tExit = new Timer(); private TimerTask task = new TimerTask() { @Override public void run() { isExit = false; hasTask = true; } }; private FragmentTabAdapter tabAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); fragments.add(new FragmentOne()); fragments.add(new FragmentTwo()); fragments.add(new FragmentThree()); rgs = (RadioGroup) findViewById(R.id.tabs_rg); button = (RadioButton) findViewById(R.id.tab_rb_a); tabAdapter = new FragmentTabAdapter(this, fragments, R.id.tab_content, rgs); tabAdapter.setOnRgsExtraCheckedChangedListener(new FragmentTabAdapter.OnRgsExtraCheckedChangedListener() { @Override public void OnRgsExtraCheckedChanged(RadioGroup radioGroup, int checkedId, int index) { // 利用这个index可以实现,如果不是在主页,按第一遍让它先跳转到第一个Fragment System.out.println("Extra---- " + index + " checked!!! "); MainActivity.this.index = index; } }); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { if(index == 0) { if(isExit == false) { isExit = true; Toast.makeText(MainActivity.this, "再按一次退出程序", Toast.LENGTH_SHORT).show(); if(!hasTask) { tExit.schedule(task, 1000); } } else { finish(); System.exit(0); } } else { // 如果不是在主页,按第一遍让它先跳转到第一个Fragment // 利用上面的check方法会导致onCheckedChanged方法被执行多次 // rgs.check(button.getId()); button.setChecked(true); } } return false; } }

为了能同时学习Fragment生命周期,我在Fragment每个生命周期方法中加入了log打印,一个有三个这样的Fragment,我只贴出其中一个代码,其余和这个一样:

/** *@Description: *@Author:Nate Robinson *@Since:2015-2-12 */ public class FragmentOne extends BaseFragment { private View view; @Override public void onAttach(Activity activity) { super.onAttach(activity); Log.d(TAG, "1==>FragmentOne=>onAttach"); } @Override public void onCreate(Bundle savedInstanceState) { Log.d(TAG, "2==>FragmentOne==>onCreate"); super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.d(TAG, "3==>FragmentOne==>onCreateView"); view = inflater.inflate(R.layout.fragment1, container, false); TextView tv = (TextView) view.findViewById(R.id.tv); tv.setText("FragmentOne"); return view; } @Override public void onActivityCreated(Bundle savedInstanceState) { Log.d(TAG, "4==>FragmentOne==>onActivityCreated"); super.onActivityCreated(savedInstanceState); } @Override public void onStart() { Log.d(TAG, "5==>FragmentOne==>onStart"); super.onStart(); } @Override public void onResume() { Log.d(TAG, "6==>FragmentOne==>onResume"); super.onResume(); } @Override public void onPause() { Log.d(TAG, "7==>FragmentOne==>onPause"); super.onPause(); } @Override public void onStop() { Log.d(TAG, "8==>FragmentOne==>onStop"); super.onStop(); } @Override public void onDestroyView() { Log.d(TAG, "9==>FragmentOne==>onDestroyView"); super.onDestroyView(); } @Override public void onDestroy() { Log.d(TAG, "10==>FragmentOne==>onDestroy"); super.onDestroy(); } @Override public void onDetach() { Log.d(TAG, "11==>FragmentOne==>onDetach"); super.onDetach(); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { Log.d(TAG, "FragmentOne==>onViewCreated"); super.onViewCreated(view, savedInstanceState); } }

在编写过程中,我为了实现如果不是在主页,按第一遍让它先跳转到第一个Fragment这个效果,一开始使用了rgs.check(button.getId());这个方法,结果发现,这样的话onCheckedChanged监听事件会执行两次,后来改为button.setChecked(true);这个方法之后,成功解决了这个问题。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-10-24 07:04:24

Android利用Fragment实现Tab选项卡效果的相关文章

Android利用Fragment实现Tab选项卡效果_Android

利用Fragment实现Tab选项卡效果:  将RadioGroup与Fragment集合,实现tab选项卡效果,这里面最关键的几个文件:  1.FragmentTabAdapter类: /** *@Description: *@Author:Nate Robinson *@Since:2015-2-12 */ public class FragmentTabAdapter implements RadioGroup.OnCheckedChangeListener { private List<

Android编程实现自定义Tab选项卡功能示例

本文实例讲述了Android编程实现自定义Tab选项卡功能.分享给大家供大家参考,具体如下: import android.app.TabActivity; import android.content.Intent; import android.os.Bundle; import android.widget.*; import android.widget.TabHost.OnTabChangeListener; import android.os.Build; import androi

我的Android进阶之旅------&amp;gt;Android利用温度传感器实现带动画效果的电子温度计

     要想实现带动画效果的电子温度计,需要以下几个知识点: 1.温度传感器相关知识. 2.ScaleAnimation动画相关知识,来进行水印刻度的缩放效果. 3.android:layout_weight属性的合理运用,关于android:layout_weight属性的讲解,可以参考:<我的Android进阶之旅------>关于android:layout_weight属性的一个面试题> 地址为:http://blog.csdn.net/ouyang_peng/article/

jQuery实现滚动切换的tab选项卡效果代码_jquery

本文实例讲述了jQuery实现滚动切换的tab选项卡效果代码.分享给大家供大家参考.具体如下: 这里介绍的jquery tab选项卡滚动动态切换代码,似乎很个性的网页选项卡,没有边框的修饰,但十分简约大方,选项卡菜单目前在各大网站很流行,做为前端设计者,能够得心应手的写出一个选项卡是很有必要的哦,希望本代码能为您带去一份参考资料. 先来看看运行效果截图: 在线演示地址如下: http://demo.jb51.net/js/2015/jquery-scroll-cha-tab-nav-style-

js实现类似菜单风格的TAB选项卡效果代码_javascript技巧

本文实例讲述了js实现类似菜单风格的TAB选项卡效果代码.分享给大家供大家参考.具体如下: 这是一款基于javascript实现的一组简洁选项卡代码,类似菜单风格的TAB选项卡,没有使用图片,因此有些地方处理的还不太到位,不介意使用图片修饰的朋友可以再次美化这上选项卡,风格有点类似于菜单. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-menu-style-tab-nav-codes/ 具体代码如下: <html xmlns="ht

jquery实现通用的内容渐显Tab选项卡效果_jquery

本文实例讲述了jquery实现通用的内容渐显Tab选项卡效果.分享给大家供大家参考.具体如下: 这是一款网页常用的TAB选项卡功能,无鼠标操作的时候它可以自动轮换,美化一般,看上去有些粗糙,有兴趣使用的朋友可以进行细致修饰,相信会更漂亮的. 运行效果如下图所示: 在线演示地址如下: http://demo.jb51.net/js/2015/jquery-show-info-tab-nav-codes/ 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD X

jquery实现超简洁的TAB选项卡效果代码_jquery

本文实例讲述了jquery实现超简洁的TAB选项卡效果代码.分享给大家供大家参考.具体如下: 这是一款超简洁的TAB选项卡,个人觉得有点太简单,简单的有点不习惯,美化修饰一下其实效果更好.实际上应该为点击过的TAB添加一个背景色,区分一下,这样比较好. 先来看看运行效果截图: 在线演示地址如下: http://demo.jb51.net/js/2015/jquery-easy-tab-cha-menu-codes/ 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C

jquery插件tytabs.jquery.min.js实现渐变TAB选项卡效果_jquery

本文实例讲述了jquery插件tytabs.jquery.min.js实现渐变TAB选项卡效果.分享给大家供大家参考.具体如下: 这款网页特效主要是tytabs.jquery.min.js插件的实例演示,一个带有漂亮渐变效果的TAB选项卡,演示了一个网页上设置两个选项卡,都是带有淡入淡出的渐变效果,为了演示效果,里面我随便弄了些文字,用时候自己删除吧. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/jquery-tytabs-tab-cha-m

js实现黑色简易的滑动门网页tab选项卡效果_javascript技巧

本文实例讲述了js实现黑色简易的滑动门网页tab选项卡效果.分享给大家供大家参考.具体如下: 这是一款js实现的黑色风格网页滑动门菜单,虽然简洁但看上去不失大气,稍微修改一下即可换成选项卡,懂JS的朋友可好好修改一下哦,改成你喜欢的样式. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-simple-black-style-web-tab-codes/ 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C//DT