一、概述

                淘宝相信大家都在用过,不过不知道各位有没有仔细观察过淘宝的tab界面,尤其是返回的时候的逻辑。最近闲来无事,猛然发现淘宝的tab界面还真的挺好玩,废话不多说,接下来就开始我们的正题:
        首先,我们先来分析一下他的返回逻辑,仔细观察你会发现,他并不是你一点返回就会让你退,而是只有你在主界面的时候才会让你退出。当不在主界面时则会依次返回到你以前的界面,在主界面退出。如果重复点击同一个tab,则会把跳转到前一个相同tab,并把之后所有tab移除。
       好了,逻辑先分析到这里,大家可以打开手机淘宝慢慢体会。

二、代码实现

首先,我们先来实现tab界面,这里我们使用radiogroup+fragment的方式

我们先来编写5个Fragment,这里仅作演示,所以简单编写了几个

public class Fragment1 extends Fragment{@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {TextView textView=new TextView(getActivity());textView.setText("Fragment1");return textView;}
}
   其他四个分别为: Fragment2 ,Fragment3 ,Fragment4 ,Fragment5,内容与上面代码一致,为了节省空间和时间,这里就不一    一列出
      接下里我们为fragment建立一个工厂类:
           
 
public class FragmentFactory {private  static SparseArray<Fragment> fragmentList=new SparseArray<>();   //fragment集合,保证每个fragment只被 实例一次public static Fragment getLocalFragment(int id) {Fragment fragment =fragmentList.get(id);if(fragment!=null)return  fragment;switch (id) {case R.id.id_main_radio:fragment = new Fragment1();break;case R.id.id_change_radio:fragment = new Fragment2();break;case R.id.id_record_radio:fragment = new Fragment3();break;case R.id.id_setting_radio:fragment = new Fragment4();break;case R.id.id_shenqing_radio:fragment = new Fragment5();break;}fragmentList.put(id,fragment);          //保存此fragment,方便下次调用return fragment;}
}
      接下来看main.xml的布局文件
   
  
<?xml version="1.0" encoding="utf-8"?><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"xmlns:android="http://schemas.android.com/apk/res/android"><FrameLayoutandroid:id="@+id/frame"android:layout_width="fill_parent"android:layout_height="0dp"android:layout_weight="1" /><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content" ><RadioGroupandroid:id="@+id/tabgroup"android:layout_width="fill_parent"android:layout_height="52dp"android:layout_gravity="bottom"android:orientation="horizontal" ><RadioButtonandroid:id="@+id/id_main_radio"style="@style/weibo_tab"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_weight="1"android:checked="true"android:drawableTop="@drawable/home"android:text="首页" /><RadioButtonandroid:id="@+id/id_change_radio"style="@style/weibo_tab"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_weight="1"android:drawableTop="@drawable/myservice"android:text="我的服务" /><RadioButtonandroid:id="@+id/id_shenqing_radio"style="@style/weibo_tab"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_weight="1"android:drawableTop="@drawable/myapply"android:text="申请" /><RadioButtonandroid:id="@+id/id_record_radio"style="@style/weibo_tab"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_weight="1"android:drawableTop="@drawable/cart"android:text="购物车" /><RadioButtonandroid:id="@+id/id_setting_radio"style="@style/weibo_tab"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_weight="1"android:drawableTop="@drawable/mine"android:text="我" /></RadioGroup></RelativeLayout>
</LinearLayout>

 style如下:
      
   <style name="weibo_tab"><item name="android:layout_height">wrap_content</item><item name="android:layout_width">match_parent</item><item name="android:layout_weight">1</item><item name="android:gravity">center</item><item name="android:paddingTop">8dip</item><item name="android:background">@drawable/background</item><item name="android:paddingBottom">4dip</item><item name="android:button">@null</item><item name="android:textSize">12sp</item><item name="android:textColor">@drawable/radiotext</item></style>
   最后就是我们的重中之重了,也就是我们的MainActivity:
       
   好了,至此,我们的仿淘宝tab返回就算是基本完成了,快来看看我们的效果吧:
   
项目下载地址:点击下载demo
public class MainActivity extends FragmentActivity implementsOnCheckedChangeListener {private static RadioGroup tab_group;private FragmentManager fragmentManager;public Context context;private int[] radioIds;              //存放所有Radiobutton的idprivate static Boolean isExit = false;private boolean isBack;    //记录是都是返回,如果是返回则不调用onCheckedChanged@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.main);context = MainActivity.this;initViews();fragmentManager = getSupportFragmentManager();FragmentTransaction transaction = fragmentManager.beginTransaction();Fragment mainFragment=FragmentFactory.getLocalFragment(R.id.id_main_radio);transaction.add(R.id.frame, mainFragment, R.id.id_main_radio + "");transaction.addToBackStack(R.id.id_main_radio + "");    //放入栈底,保证每次都从首页退出transaction.commit();ActivityManager.getInstance().addActivity(this);}private void initViews() {tab_group = (RadioGroup) findViewById(R.id.tabgroup);tab_group.setOnCheckedChangeListener(this);radioIds = new int[] { R.id.id_main_radio, R.id.id_change_radio,R.id.id_shenqing_radio,R.id.id_record_radio, R.id.id_setting_radio };}@Overridepublic void onCheckedChanged(RadioGroup group, int checkedId) {if(isBack){isBack=false;return;    }else {tab_group.check(tab_group.getCheckedRadioButtonId());FragmentTransaction transaction = fragmentManager.beginTransaction();Fragment fragment1=fragmentManager.findFragmentByTag(checkedId + "");if(fragment1==null){//如果为空,则表明此fragment从来没有被点击过fragment1 = FragmentFactory.getLocalFragment(checkedId);transaction.addToBackStack(checkedId+"");}else {//该fragment已经入栈boolean isCurrent=false;       //是否是当前栈for (int i=0,size=fragmentManager.getBackStackEntryCount();i<size;i++){String name=fragmentManager.getBackStackEntryAt(i).getName();  //获取当前栈名称if(isCurrent)fragmentManager.popBackStack();if(name.equals(checkedId+"")){isCurrent=true;}}}transaction.replace(R.id.frame, fragment1,checkedId+"");transaction.commit();}}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK) {FragmentManager fragmentManager=getSupportFragmentManager();int count=fragmentManager.getBackStackEntryCount();if(count>1){fragmentManager.popBackStack();isBack=true;BackStackEntry backstatck=getSupportFragmentManager().getBackStackEntryAt(count-1);RadioButton radioButton=(RadioButton) tab_group.findViewById(radioIds[(backstatck.getId()-1)%5]);radioButton.setChecked(true);}else {exitBy2Click();}}return false;}private void exitBy2Click() {Timer tExit = null;if (isExit == false) {isExit = true;Toast.makeText(this, "再按一次退出", Toast.LENGTH_SHORT).show();tExit = new Timer();tExit.schedule(new TimerTask() {@Overridepublic void run() {isExit = false;}}, 2000);} else {ActivityManager.getInstance().exit();}}
}

Android仿淘宝tab返回相关推荐

  1. Android仿淘宝详情页面viewPager滑动到最后一张图片跳转的功能

    需要做一个仿淘宝客户端ViewPager滑动到最后一页,再拖动的时候跳到详情的功能,刚开始我也迷糊了,通过查阅相关资料发现有好多种实现方法,下面小编给大家分享实例代码,感兴趣的朋友一起看看吧 需要做一 ...

  2. Android仿淘宝淘口令实现

    先复制信息到剪切板,然后再打开淘宝,.既然是复制,肯定是复制到系统的剪切板了,我们可以通过下边的代码来把口令给复制到系统的剪切板里 1 2 3 4 5 6 //获取剪贴板管理器: ClipboardM ...

  3. Android仿淘宝、京东Banner滑动查看图文详情

    文章目录 写在前面 效果图 原理分析 核心代码 源码地址 写在前面 本文基于 ViewPager2 实现的 Banner 效果,进而实现了仿淘宝.京东Banner滑动至最后一页时继续滑动来查看图文详情 ...

  4. Android仿淘宝首页UI(附代源代码及示例图片)

    Android仿淘宝首页UI(附代源代码及示例图片) 可以收获 运行出来的效果 部分代码 源代码 可以收获 更改Layout中的文字和drawble中的图片即可生成适应于不同情景的APP,帮助开发者完 ...

  5. Android 仿淘宝商品详情页下拉足迹Demo

    DropDownMultiPager 仿淘宝等商品详情页下拉足迹效果SimpleDemo 可colne之后看MainActivity的调用,方便二次开发 依赖 compile 'com.nineold ...

  6. android仿淘宝语音搜索功能集成科大讯飞

    样式: 1.集成科大讯飞:网上有很多集成方法. 2.写布局,注意帧布局有顺序谁在最上面,要在布局文件下面写.下面是我的布局,注意用Scrollview套,是因为要随键盘上下滑动. <Relati ...

  7. Android仿淘宝底部图标导航栏

     在上一篇中,简单的使用透明主题的Activity实现了仿微信右侧顶部的对话框,上午又花了两个小时研究了一下淘宝底部的导航栏实现,网上的做法也有很多,今天我就使用一种通过基本控件加上布局的方式,没有任 ...

  8. Android 仿淘宝2017添加地址

    最近想做个商城仿淘宝收货地址选择,在网上搜索"android 淘宝收货地址",就看到了想要的效果. 文章写的不错,可惜菜鸟级的我很多看不懂,所以用例外一种方式实现了. 这里用到的数 ...

  9. android 仿淘宝、京东商品详情页 向上拖动查看图文详情控件

    一.淘宝商品详情页效果 先看一下淘宝详情页的效果 我们的效果 二.实现思路 使用两个scrollView,两个scrollView 竖直排列,通过自定义viewGroup来控制两个scrollView ...

最新文章

  1. 【转】 SLIC超像素分割详解(一):简介
  2. P5488 差分与前缀和(多项式/生成函数)
  3. Android RecyclerView封装下拉刷新与上拉加载更多
  4. 配置管理系统和整体变更系统有什么区别与联系
  5. 别让PPT把你绑架了
  6. Selenium 模拟键盘操作
  7. Arduino Uno ADS1115 数模转换
  8. osl倒数第三层_原子最外层、次外层及倒数第三层最多容纳电子数的解释
  9. 【网页截图亲测可用】Linux + python3 + selenium + chrome + chrome-driver 服务器端网页截图
  10. 增强现实技术(AR)的103个应用场景汇总
  11. UOJ132 【NOI2015】小园丁与老司机
  12. 个人信息安全现状及保护方法
  13. 用Python求三角形面积
  14. SCI检索号识别一法:UT-WOS与UT-ISI
  15. Android10闪退无日志,【报Bug】Android10手机白屏闪退
  16. 高中关于人工智能方面的课题_AI相关专业或成热门?高中生也可以入门“人工智能”...
  17. 计算机游戏比赛,计算机学习系统问世 机器会学习游戏比赛
  18. 江波龙入选国家级专精特新“小巨人”企业
  19. 深信服校园招聘c/c++ 软件开发A卷--菜鸡落泪
  20. SUST-ACM-2019届暑期ACM集训热身赛(第二期)题解

热门文章

  1. 浅谈昆明程序猿现状和前景
  2. 宝付大叔的辛酸创业史
  3. 云计算基础平台iaas(openstack)超级详细搭建(一)
  4. php做远程桌面,Linux远程桌面实现步骤
  5. 大数据的另一门生意经:如何玩转NBA?
  6. 【讲大道理】参加什么信息学比赛对升学有帮助?
  7. IP访问控制列表配置
  8. Python爬虫实战——爬取RUNOOB.COM的Python3教程
  9. Linux冷门却很重要的命令(八)---xargs
  10. 播放视频AVPlayer使用详解