iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android利用Fragment实现Tab选项卡效果
  • 140
分享到

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

tabfragmentAndroid 2022-06-06 07:06:41 140人浏览 薄情痞子
摘要

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

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

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

1.FragmentTabAdapter类:



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);
  }
  }
 }
 }
 
 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;
 }
 
 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类:



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,我只贴出其中一个代码,其余和这个一样:



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);这个方法之后,成功解决了这个问题。

您可能感兴趣的文章:Android实现底部导航栏功能(选项卡)Android多个TAB选项卡切换效果Android仿微信底部实现Tab选项卡切换效果Android实现类似网易新闻选项卡动态滑动效果Android编程实现自定义Tab选项卡功能示例Android编程实现将tab选项卡放在屏幕底部的方法Android开发之选项卡功能的实现方法示例Android实现知乎选项卡动态隐藏效果实例


--结束END--

本文标题: Android利用Fragment实现Tab选项卡效果

本文链接: https://www.lsjlt.com/news/24461.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • js开发插件实现tab选项卡效果
    本文实例为大家分享了js插件实现tab选项卡效果的具体代码,供大家参考,具体内容如下 一、搭建页面 <div class="tab" data-config='{ // 在...
    99+
    2024-04-02
  • JavaScript插件如何实现Tab选项卡效果
    这篇文章将为大家详细讲解有关JavaScript插件如何实现Tab选项卡效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先,来看看最终效果:这是一款普通的Tab选项卡...
    99+
    2024-04-02
  • Android使用TabLayout+Fragment实现顶部选项卡
    先看效果图:使用Tablayout,首先需要在项目中加入Design包dependencies { compile 'com.android.support:design:24.1.1' }...
    99+
    2023-05-31
    android tablayout fragment
  • jQuery如何实现移动端Tab选项卡效果
    小编给大家分享一下jQuery如何实现移动端Tab选项卡效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!效果图:代码如下:&l...
    99+
    2024-04-02
  • vue子路由跳转实现tab选项卡效果
    tab选项卡的布局在项目中是很常见的,在后台管理系统中左边是导航栏固定,右边是对应的页面,每次点击左边的标题,只有右面的对应页面在切换,而vue要做tab选项卡,推荐使用实现a标签的...
    99+
    2024-04-02
  • 怎么用纯CSS3实现的tab选项卡特效
    这篇文章主要介绍“怎么用纯CSS3实现的tab选项卡特效”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用纯CSS3实现的tab选项卡特效”文章能帮助大家解决问题...
    99+
    2024-04-02
  • 怎么用css3实现tab选项卡
    这篇文章主要讲解了“怎么用css3实现tab选项卡”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用css3实现tab选项卡”吧!  今天给大家带来一款纯...
    99+
    2024-04-02
  • vue子路由跳转实现tab选项卡效果的方法
    这篇文章主要介绍“vue子路由跳转实现tab选项卡效果的方法”,在日常操作中,相信很多人在vue子路由跳转实现tab选项卡效果的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue子路由跳转实现tab选项...
    99+
    2023-06-29
  • jQuery实现滑动tab选项卡
    本文实例为大家分享了jQuery实现滑动tab选项卡的具体代码,供大家参考,具体内容如下 先上最终效果: 需求分析: 1.选项卡菜单数量不固定,菜单内容不固定,导致了单个菜单和整体...
    99+
    2024-04-02
  • Vue实现Tab选项卡切换
    本文实例为大家分享了Vue实现Tab选项卡切换的具体代码,供大家参考,具体内容如下 点击不同的标题显示出相应的图片 代码如下 <!DOCTYPE html> <...
    99+
    2024-04-02
  • Android利用GridView实现单选效果
    1.实现如图所示的单选效果由于Android提供的单选按钮radiobutton只能单行或单列显示,且样式并不美观,故可用GridView进行改造,实现单选效果,而要实现这样的效果重点就在GridView的适配器这块了。首先是GridVie...
    99+
    2023-05-31
    gridview 单选 idv
  • 用js实现简单的tab选项卡
    tab选卡 现实网页的使用频率极高,基本上每个网页都需要使用一个或多个tab选卡 我们可以用js实现简单的tab选卡效果 代码如下: <!DOCTYPE html> ...
    99+
    2024-04-02
  • jQuery实现选项卡嵌套效果
    本文实例为大家分享了jQuery实现选项卡嵌套效果的具体代码,供大家参考,具体内容如下 描述:    1.划上底部a的每一个菜单 让顶部的标签span的内容变成对...
    99+
    2024-04-02
  • 如何实现layui选项卡效果
    这篇文章将为大家详细讲解有关如何实现layui选项卡效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下<!DOCTYPE html> &...
    99+
    2024-04-02
  • Vue实现简单选项卡效果
    本文实例为大家分享了Vue实现简单选项卡效果的具体代码,供大家参考,具体内容如下 效果图 1.头部选项卡 点击切换下标ID 传递一个参数回去,active绑定选中样式 <di...
    99+
    2024-04-02
  • 如何实现bootstrap选项卡效果
    小编给大家分享一下如何实现bootstrap选项卡效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体内容如下<!doc...
    99+
    2024-04-02
  • vue2.0实现选项卡导航效果
    本文实例为大家分享了vue2.0实现选项卡导航效果的具体代码,供大家参考,具体内容如下 1:背景是一个web端的电商网站,根据点击的导航选项卡呈现不同得种类商品,首先这里说下我的路由...
    99+
    2024-04-02
  • 如何使用css3实现的tab选项卡
    这篇文章主要介绍“如何使用css3实现的tab选项卡”,在日常操作中,相信很多人在如何使用css3实现的tab选项卡问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用cs...
    99+
    2024-04-02
  • Vue实现选项卡tab切换制作
    本文实例为大家分享了Vue实现选项卡tab切换制作代码,供大家参考,具体内容如下 1.主要的实现功能如下:(点击进行切换,这里我不做太多的样式处理了,主要看功能) 2.话不多说:主...
    99+
    2024-04-02
  • Css怎么实现tab选项卡切换
    这篇文章主要介绍了Css怎么实现tab选项卡切换,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Css实现tab选项卡切换的方法:利用target的特性,可以实现纯css的ta...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作