Android back按键基础开发

来源:互联网 发布:淘宝可爱耳钉店铺推荐 编辑:程序博客网 时间:2024/06/05 01:50

Android back按键基础开发

在app设计中, 通常都会针对用户的退出按钮进行特别的开发:

  • 按下back按钮两次才退出应用
  • 在ActionBar中新增回退按钮
  • 增加按钮直接回退到主屏幕
  • ….

该篇文章针对以上的几种常见需求, 做一个模拟的例子进行简单说明


自定义Back按键

问题: 应用程序以自己的方式来处理用户按下物理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;@Overridepublic void onBackPressed() {    if(System.currentTimeMillis() - firstDown < 2000){        super.onBackPressed();    }else{        Toast.makeText(this, "再按一次退出应用", Toast.LENGTH_SHORT).show();        firstDown = System.currentTimeMillis();    }}

监听Fragment进行回退操作

问题:
目前大部分应用的主界面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按键一样的功能。

解决方案:
其实Home界面也可以理解为一个Activity。 我们只需要知道如果打开这个Activity就可以了。

实现:

Intent intent = new Intent(Intent.ACTION_MAIN);intent.addCategory(Intent.CATEGORY_HOME);startActivity(intent);

大结局:

该篇文章主要是针对一些应用场景的app开发常见的效果而产生的, 没有要求整体质量。
言语匪浅, 心意可达。


阅读全文
0 0
原创粉丝点击