尝试用mvp架构加dagger2来重写了一下,大致功能都实现了,还没有全部完成。

项目地址

接近完成的时候,想在天气信息页面实现一个很常见的功能,也就是点击屏幕下方的返回键的时候不是返回到上一个activity或者退出,而是提醒用户再按一次就会退出。

实现思路也很简单,就是对返回键的动作进行监听和拦截,然后重写成需要的动作,因为在我的程序中activity只作为调度器使用,真正的View功能在fragment中,所以返回键的动作捕捉只能以接口形式

BaseFragment实现这个接口,代码如下:

   public class BaseActivity extends AppCompatActivity {
protected final String TAG = this.getClass().getSimpleName(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityCollector.addActivity(this);
} @Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);
} //返回键监听实现
interface FragmentBackListener {
void onBackForward();
} private FragmentBackListener backListener;
private boolean isInterception = false; public void setBackListener(FragmentBackListener backListener) {
this.backListener = backListener;
}
//是否拦截
public boolean isInterception() {
return isInterception;
} public void setInterception(boolean isInterception) {
this.isInterception = isInterception;
} @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (isInterception()) {
if (backListener != null) {
backListener.onBackForward();
return false;
}
}
}
return super.onKeyDown(keyCode, event);
}
}
public abstract class BaseFragment extends Fragment implements BaseActivity.FragmentBackListener {
protected Disposable disposable;
protected final String TAG = this.getClass().getSimpleName();
//返回键点击间隔时间计算
private long exitTime = ; //捕捉返回键点击动作
@Override
public void onBackForward() {
//和上次点击返回键的时间间隔
long intervalTime = System.currentTimeMillis() - exitTime;
if (intervalTime > ) {
Toast.makeText(getActivity(), getString(R.string.exit_toast), Toast.LENGTH_SHORT).show();
exitTime = System.currentTimeMillis();
} else {
ActivityCollector.finishAll();
}
} @Override
public void onAttach(Context context) {
super.onAttach(context);
//注册监听
((BaseActivity) getActivity()).setBackListener(this);
((BaseActivity) getActivity()).setInterception(true);
} @Override
public void onDetach() {
super.onDetach();
//取消监听
((BaseActivity) getActivity()).setBackListener(null);
((BaseActivity) getActivity()).setInterception(false);
} @Override
public void onDestroyView() {
super.onDestroyView();
unsubscribe();
} protected void unsubscribe() {
if (disposable != null && !disposable.isDisposed()) {
disposable.dispose();
}
} }

通过一个ActivityCollector来管理活动:

public class ActivityCollector {
public static List<Activity> activities = new ArrayList<>(); public static void addActivity(Activity activity) {
activities.add(activity);
} public static void removeActivity(Activity activity) {
activities.remove(activity);
} public static void finishAll() {
for (Activity activity : activities) {
if (!activity.isFinishing()) {
activity.finish();
}
}
}
}

这样,所有继承BaseFragment的fragment都回拥有这个单击提醒 双击退出的功能了,代码不复杂,也带有注释,相信很容易看懂。

如果某个页面不需要这个功能可以在fragment中重写BaseFragment中的onAttach方法

@Override
public void onAttach(Context context) {
super.onAttach(context);
((BaseActivity) getActivity()).setInterception(false);
}

当然如果手机应用的大多数页面不需要这个功能,可以在BaseFragment中默认关闭拦截,在需要用的fragment中重写onAttach来打开。

最后说一点我在开发过程中遇到的小坑,在网络访问的功能方面我使用了squareup的retrofit2和okhttp

一开始我在build.gradle是这么配置的

    //squareup dependencies
compile 'com.squareup.okhttp3:okhttp:3.6.0'
compile 'com.squareup.okio:okio:1.11.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.6.0' compile 'com.squareup.retrofit2:retrofit:2.2.0'
compile 'com.squareup.retrofit2:converter-gson:2.2.0'
compile 'com.squareup.retrofit2:converter-scalars:2.2.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.2.0' //RxJava dependencies
compile 'io.reactivex.rxjava2:rxandroid:2.0.0'
compile 'io.reactivex.rxjava2:rxjava:2.0.2'

但是编译的时候无法通过,

经过排查,原因是retrofit2自带的rxjava适配器还未升级到rxjava2,所以产生了编译错误,解决办法也不复杂Jake大神给我写了一个rxjava2的适配器,替换原来的就可以了:

    //squareup dependencies
compile 'com.squareup.okhttp3:okhttp:3.6.0'
compile 'com.squareup.okio:okio:1.11.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.6.0' compile 'com.squareup.retrofit2:retrofit:2.2.0'
compile 'com.squareup.retrofit2:converter-gson:2.2.0' //gson转化器
compile 'com.squareup.retrofit2:converter-scalars:2.2.0'//String转化器
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0' //RxJava dependencies
compile 'io.reactivex.rxjava2:rxandroid:2.0.0'
compile 'io.reactivex.rxjava2:rxjava:2.0.2'

Android 在fragment中实现返回键单击提醒 双击退出的更多相关文章

  1. 在fragment中实现返回键单击提醒 双击退出

    最近在练习一个小项目,也就是郭霖大神的开源天气程序,尝试用mvp架构加dagger2来重写了一下,大致功能都实现了,还没有全部完成. 项目地址 接近完成的时候,想在天气信息页面实现一个很常见的功能,也 ...

  2. 在Fragment 中拦截返回键

    代码如下: class XXXFrgmt : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ...

  3. android中的返回键与Activity

          我在做应用时遇到一个问题.就是在启动主页面时须要预先载入一些数据.我是在一个载入页中处理完这些数据然后再转到主页面.但当我在主页面中按返回键时,系统会返回载入页面.我不希望载入页在使用完之 ...

  4. Android应用开发按下返回键退向后台执行

    转载请注明来源:http://blog.csdn.net/kjunchen/article/details/50429694 Android应用开发按下返回键退向后台执行 我们日常使用的非常多Andr ...

  5. Android必知必会-Fragment监听返回键事件

    如果移动端访问不佳,请尝试 Github版<–点击左侧 背景 项目要求用户注册成功后进入修改个人资料的页面,且不允许返回到上一个页面,资料修改完成后结束当前页面,进入APP主页. 由于是使用多个 ...

  6. Android 优雅的让Fragment监听返回键

    Activity可以很容易的得到物理返回键的监听事件,而Fragment却不能.假设FragmentActivity有三个Fragment,一般安卓用户期望点击返回键会一层层返回到FragmentAc ...

  7. cocos2d-x在android中响应返回键编译报错的bug分析

    先看一段代码如何在Android中加入返回按键的响应 <span style="font-size:18px;">自己派生CCKeypadDelegate的子类,然后注 ...

  8. Android 应用按两下返回键退出应用程序

    在android应用开发中,有时候应用会用到按两下返回键退出应用的功能,今天介绍一下这个功能,直接上代码: @Override public boolean dispatchKeyEvent(KeyE ...

  9. 让Fragment监听返回键

    Activity可以很容易的得到物理返回键的监听事件,而Fragment却不能.所以使用到了以下的方法. 首先创建一个抽象类BackHandledFragment,该类有一个抽象方法onBackPre ...

随机推荐

  1. HDU 1210

    感觉就是乱搞找规律 自己写几组数据 本来开始是想着把 n 个数字每次回到原来位置各需要多少次,然后取它们的最小公倍数就好了 但是数据写着写着发现每一个数回到原来位置次数都是一样的,那么就简单了,直接第 ...

  2. poj 2135最小费用最大流

    最小费用最大流问题是经济学和管理学中的一类典型问题.在一个网络中每段路径都有"容量"和"费用"两个限制的条件下,此类问题的研究试图寻找出:流量从A到B,如何选择 ...

  3. 中庸之道(codevs 2021)

    题目描述 Description 给定一个长度为N的序列,有Q次询问,每次询问区间[L,R]的中位数. 数据保证序列中任意两个数不相同,且询问的所有区间长度为奇数. 输入描述 Input Descri ...

  4. 人人都是 DBA

    http://www.cnblogs.com/gaochundong/tag/DBA/

  5. Visual Studio 中的 .NET Framework 类库

    Visual Studio 中的 .NET Framework 类库 .NET Framework 类库由命名空间组成.每个命名空间都包含可在程序中使用的类型:类.结构.枚举.委托和接口. 当您在 V ...

  6. SIGSEGV 和 SIGBUS & gdb看汇编

    参考这篇文章: http://blog.chinaunix.net/uid-24599332-id-2122898.html SIGBUS和SIGSEGV也许是我们在平时遇到的次数最多的两个内存错误信 ...

  7. c++面试问题的几个方向

    1 关于多态,面向对象的几个要点作为面向对象的程序员,这个问题是必须要弄清楚的,网上.教科书上都是标准答案,关键是理解内涵哦. 2 关于虚函数表和RTTI 这个Inside C++ Object Mo ...

  8. 【CV论文阅读】:Rich feature hierarchies for accurate object detection and semantic segmentation

    R-CNN总结 不总结就没有积累 R-CNN的全称是 Regions with CNN features.它的主要基础是经典的AlexNet,使用AlexNet来提取每个region特征,而不再是传统 ...

  9. duilib-Ex-Debug

    因为一些事件google无法訪问,托管在其上的项目也无法检出也基本无人更新,因此维护了一个版本号,用于排除已有的bug和扩展一些功能.这样能够避免反复造轮子和反复的修车子.欢迎大家一起维护.本人能力和 ...

  10. Java泛型解析(01):认识泛型

    Java泛型解析(01):认识泛型 What      Java从1.0版本号到如今的8.中间Java5中发生了一个非常重要的变化,那就是泛型机制的引入.Java5引入了泛型,主要还是为了满足在199 ...