Android仿淘宝tab返回

一、概述

                淘宝相信大家都在用过,不过不知道各位有没有仔细观察过淘宝的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 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的布局文件
   
  



 style如下:
      
   <style name="weibo_tab"><item name="android:layout_height">wrap_contentitem><item name="android:layout_width">match_parentitem><item name="android:layout_weight">1item><item name="android:gravity">centeritem><item name="android:paddingTop">8dipitem><item name="android:background">@drawable/backgrounditem><item name="android:paddingBottom">4dipitem><item name="android:button">@nullitem><item name="android:textSize">12spitem><item name="android:textColor">@drawable/radiotextitem>style>
   最后就是我们的重中之重了,也就是我们的MainActivity:
       
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();i1){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();}}
}

   好了,至此,我们的仿淘宝tab返回就算是基本完成了,快来看看我们的效果吧:
   
项目下载地址:点击下载demo


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部