在app设计中, 通常都会针对用户的退出按钮进行特别的开发:
按下back按钮两次才退出应用在ActionBar中新增回退按钮增加按钮直接回退到主屏幕….该篇文章针对以上的几种常见需求, 做一个模拟的例子进行简单说明
问题: 应用程序以自己的方式来处理用户按下物理Back按键后的行为;
解决方案: 可以在Activity中调用onBackPressed()回调方法或者再Fragment中popBackStack中操作回退栈;
实现: 如果想要在Activity中进行用户点击物理Back按键后得到相应的通知, 可以复写Activity中的onBackPressed()回调方法。
// 当用户点击物理Back按键的时候, 会调用该方法 class MainActivity extends Activity{ ... @Override public void onBackPressed() { super.onBackPressed(); } }这个方法的默认实现会将该Activity中绑定的Fragment全部弹出并且销毁该Activity, 如果需要修改这个默认流程, 只需要确保不调用super方法即可。(不进行源码分析)
场景: 用户需要在两秒钟之内按两次Back按键才认为需要退出该界面, 否则认为用户的误操作。
// 当用户点击物理Back按键的时候, 会调用该方法 long firstDown = 0l; @Override public void onBackPressed() { if(System.currentTimeMillis() - firstDown < 2000){ super.onBackPressed(); }else{ Toast.makeText(this, "再按一次退出应用", Toast.LENGTH_SHORT).show(); firstDown = System.currentTimeMillis(); } }问题: 目前大部分应用的主界面Tab都采用的是Fragment进行管理, 然而我们都知道, Fragment只是依附于Activity上的, 当用户打开多个Fragment时, 进行物理Back按键退出的时候, 希望能够通过打开的Fragment顺序进行依次关闭或者直接回退到第一个Fragment主界面。
解决方案: 在进行Fragment的绑定的时候, 我们需要将当前的Activity添加到回退栈中, 当用户按下物理Back按键时, 可根据回退栈中的Fragment进行依次回退或回退到指定的Fragment中
实现: 不管是进行Fragment的依次回退还是指定回退, 都需要先将Fragment添加至Fragment的回退栈中。
class MainActivity extends Activity{ .... void init(){ FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.add(R.id.main_fragment_layout, MyFragment.newInstance("one"), "one"); transaction.addToBackStack("one"); transaction.commit(); transaction = fragmentManager.beginTransaction(); transaction.add(R.id.main_fragment_layout, MyFragment.newInstance("two"), "two"); transaction.addToBackStack("two"); transaction.commit(); transaction = fragmentManager.beginTransaction(); transaction.add(R.id.main_fragment_layout, MyFragment.newInstance("three"), "three"); transaction.addToBackStack("three"); transaction.commit(); transaction = fragmentManager.beginTransaction(); transaction.add(R.id.main_fragment_layout, MyFragment.newInstance("four"), "four"); transaction.addToBackStack("four"); transaction.commit(); } public static class MyFragment extends Fragment{ private String title; public static Fragment newInstance(String title){ MyFragment fragment = new MyFragment(); fragment.setTitle(title); return fragment; } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { TextView tv = new TextView(getActivity()); tv.setText(title); tv.setBackgroundColor(Color.parseColor("#4400ff00")); return tv; } public void setTitle(String title){ this.title = title; } } }上诉代码通过FragmentTransaction.addToBackStack("xxx") 把Fragment添加到回退栈中, 名称为"xxx" 当我们需要进行指定回退的时候, 这个参数就很有用了。
场景1:本应用有个抽屉效果, 每个抽屉的item都是一个Fragment表示, 当我们依次点开item后, 用户退出时,需要从当前显示的item内容依次回退到第一个item。
class MainActivity extends Activity{ ... getSupportFragmentManager().popBackStack(); }上诉方法, 将会从Fragment中的回退栈中依次的退出。
场景2:本应用有个抽屉效果, 每个抽屉的item都是一个Fragment表示,当用户按下物理Back按键时, 需要回退到第一个Framgent内容, 再决定是否需要退出app。
class MainActivity extends Activity{ ... getSupportFragmentManager().popBackStack("two", FragmentManager.POP_BACK_STACK_INCLUSIVE); }背景: 应用程序有一个按钮, 需要跟物理Home按键一样的功能。
解决方案: 其实Home界面也可以理解为一个Activity。 我们只需要知道如果打开这个Activity就可以了。
实现:
Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); startActivity(intent);该篇文章主要是针对一些应用场景的app开发常见的效果而产生的, 没有要求整体质量。 言语匪浅, 心意可达。