Android仿淘宝tab返回
2016-04-06 09:37
435 查看
一、概述
淘宝相信大家都在用过,不过不知道各位有没有仔细观察过淘宝的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 { privatestatic SparseArray<Fragment> fragmentList=new SparseArray<>(); //fragment集合,保证每个fragment只被 实例一次 public static Fragment getLocalFragment(int id) { Fragment fragment =fragmentList.get(id); if(fragment!=null) returnfragment; 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"?> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android"> <FrameLayout android:id="@+id/frame" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" /> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <RadioGroup android:id="@+id/tabgroup" android:layout_width="fill_parent" android:layout_height="52dp" android:layout_gravity="bottom" android:orientation="horizontal" > <RadioButton android: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="首页" /> <RadioButton android: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="我的服务" /> <RadioButton android: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="申请" /> <RadioButton android: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="购物车" /> <RadioButton android: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:
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();}}}
好了,至此,我们的仿淘宝tab返回就算是基本完成了,快来看看我们的效果吧:
项目下载地址:点击下载demo
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories