我们知道。APP在设计上习惯性的把返回button放在屏幕的左上角,那么,在非常多时候(尤其是大屏幕手机),操作改返回button,就会有诸多不便了。为了更加方便实现“返回”功能。如今的一些APP,如百度贴吧等。開始引入一种的新的交互方式,通过滑动屏幕。利用手势事件来高速且友好的实现该功能。

怎样高速实现上图的效果呢。Github上提供了一个开源的库SwipeBackLayout,地址:https://github.com/ikew0ng/SwipeBackLayout , 通过它,我们就能高速实现滑动返回上一级页面了。

1. 新建项目。并导入SwipeBackLayout库(对于不熟悉的开源库,我总建议引用库。方便源代码的阅读和改动)

2. 新建Activity,要求继承SwipeBackActivity

public class SecondActivity extends SwipeBackActivity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
}

对,就这么简单,不须要在做不论什么操作,该Activity就已经能够支持“从左向右滑动返回上一级页面”了。

当然,只这样还是不够的,在页面滑动过程中,会遇到些问题:

问题1:页面滑动过程中背景黑屏:

解决该问题,我们则要为须要滑动的Activity设置背景透明的主题,不须要滑动的。自然也就无需设置了:

 <activity
android:name=".DemoActivity"
android:label="@string/app_name"/>
<activity
android:name=".SecondActivity"
android:theme="@style/otherPageStyle" />

 <!--
Base application theme, dependent on API level. This theme is replaced
by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
-->
<style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light.NoActionBar"> </style> <!-- Application theme. -->
<style name="AppTheme" parent="@style/AppBaseTheme">
</style> <!-- 首页(第一级页面不让Activity透明) -->
<style name="mainPageStyle" parent="AppTheme">
<item name="android:windowIsTranslucent">false</item>
</style> <!-- 非首页(非第一级页面让Activity透明) -->
<style name="otherPageStyle" parent="AppTheme">
<item name="android:windowIsTranslucent">true</item>
</style>

问题2:实战项目中,经常会出现已有基类BaseActivity,怎样集成在一起呢?

1. 创建一个基类,BaseActivity

public class BaseActivity extends FragmentActivity {

    @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}

2. 拷贝一份SwipeBackActivity.java源代码,改动下。继承自BaseActivity:

import android.os.Bundle;
import android.view.View; import me.imid.swipebacklayout.lib.SwipeBackLayout;
import me.imid.swipebacklayout.lib.Utils;
import me.imid.swipebacklayout.lib.app.SwipeBackActivityBase;
import me.imid.swipebacklayout.lib.app.SwipeBackActivityHelper; public class MySwipeBackActivity extends BaseActivity implements SwipeBackActivityBase {
private SwipeBackActivityHelper mHelper; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mHelper = new SwipeBackActivityHelper(this);
mHelper.onActivityCreate();
} @Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
mHelper.onPostCreate();
} @Override
public View findViewById(int id) {
View v = super.findViewById(id);
if (v == null && mHelper != null)
return mHelper.findViewById(id);
return v;
} @Override
public SwipeBackLayout getSwipeBackLayout() {
return mHelper.getSwipeBackLayout();
} @Override
public void setSwipeBackEnable(boolean enable) {
getSwipeBackLayout().setEnableGesture(enable);
} @Override
public void scrollToFinishActivity() {
Utils.convertActivityToTranslucent(this);
getSwipeBackLayout().scrollToFinishActivity();
}
}

这样,当你须要页面滑动返回的时候,则该页面的Activity就继承MySwipeBackActivity,不须要的话(比方首页),则直接继承自BaseActivity就可以。

问题3:怎样同一时候兼容SystemBarTint和SwipeBackLayout两个库。

之前写过《Android 使用SystemBarTint设置状态栏颜色》,假设什么都不做改动,直接在你的项目中引用这两个库,则会发生冲突。在4.4上。假设使用SwipeBackLayout。就不能用SystemBarTint来改变状态栏颜色。

解决该问题,能够通过改动SwipeBackLayout源代码来解决,打开SwipeBackLayout.java类,找到public
void attachToActivity(Activity activity)方法。找到:

ViewGroup decor = (ViewGroup) activity.getWindow().getDecorView();

把它改动成:

ViewGroup decor = (ViewGroup) activity.getWindow().getDecorView().findViewById(Window.ID_ANDROID_CONTENT);

如此这般,就可以解决冲突。

扩展:

在github上。另一个能够实现滑动返回上一级页面的开源库,我对照了下。感觉比SwipeBackLayout更方便,体验上也更好些。有兴趣的朋友能够自己查看:https://github.com/liuguangqiang/SwipeBack

如此这般,就OK啦!欢迎互相学习!

如有疑问,欢迎留言探讨。

Android 使用SwipeBackLayout实现滑动返回上一级页面——实战来袭的更多相关文章

  1. 类似IOS的滑动返回上一级,SwipeBackLayout-android的滑动返回类库

    最近,公司在开发App的需求中增加了一个新的需求,要在android的页面中增加向右滑动的时候返回上一级页面.我刚知道这个需求的时候,感觉有点坑,可能设计那边最近接触到知乎的客户端或者是IOS的滑动可 ...

  2. JavaScript返回上一页和返回上一级页面并刷新

    JavaScript返回上一页和刷新当前页 window.history.go(-1); //返回上一页 window.history.back(); //返回上一页 //如果要强行刷新的话就是:wi ...

  3. Xamarin.Forms listview中的button按钮,实现带着参数返回上一级页面

    今天在做列表显示的时候遇到一个问题,就是在ListView中如何才能让一个button的按钮工作并且包含参数呢? 其实有点类似于rep里的控件无法起获取一样.在Xamarin中,当你button绑定事 ...

  4. 小程序返回上一级页面背景音乐报错 setBackgroundAudioState:fail title is nil!;

    小程序初始化在onLoad的时候加载了一次背景音乐. 如果此时报错是title必传.如果没有 会报错一次 setBackgroundAudioState:fail title is nil!; 这个都 ...

  5. JS写返回上一级

    应产品需求,自己的网站上要有返回上一级的需求,几经周折,做个小总结. (1): $("XX").on("click",function(){      wind ...

  6. Web 在线文件管理器学习笔记与总结(11)获取文件夹信息 (12)返回上一级操作

    (11)获取文件夹信息 文件夹没有修改操作. index.php: <?php require 'dir.func.php'; require 'file.func.php'; require ...

  7. 织梦dedecms返回上一级链接代码

    如题:织梦dede手机页面,如果我进入了下一级页面,想回上一级,<a href="xx">该用什么标签? 用JS实现,代码如下 <a href="jav ...

  8. git bash返回上一级目录

    YITU-LIUMZ+Administrator@yitu-liumz MINGW64 ~/learngit/gitskills (dev)$ cd ..\ 注意 cd 后面有空格 然后就会弹出一个 ...

  9. os.path.join合并 os.path.dirname返回上一级目录 os.path.exists(path) os.stat('path/filename')获取文件/目录信息

    import os str1 = "grsdgfd" str2 = "wddf" str3 = "gddgs" # print(str1 + ...

随机推荐

  1. J.U.C并发框架源码阅读(十三)ThreadPoolExecutor

    基于版本jdk1.7.0_80 java.util.concurrent.ThreadPoolExecutor 代码如下 /* * ORACLE PROPRIETARY/CONFIDENTIAL. U ...

  2. windows7_64位安装sql_server_2000成功

    对于4合一的版本来说只要找到安装包里的 STANDARD.PERSONAL.ENTERPRISE.DEVELOPER文件夹下的 X86\SETUP\SETUPSQL.EXE 任何一个运行即可,(理论上 ...

  3. Codeforces Round #445 A. ACM ICPC【暴力】

    A. ACM ICPC time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...

  4. 数学【p2117】 小z的矩阵

    题目描述-->p2117 小z的矩阵 分析: 题目给定我们一个正方形. 容易想到,正方形是对称的. 推敲一下 如果我们的矩阵是这样的↓ 闭眼瞎敲出来的. \[\begin{bmatrix} {0 ...

  5. 洛谷——P1469 找筷子

    P1469 找筷子 题目描述 经过一段时间的紧张筹备,电脑小组的“RP餐厅”终于开业了,这天,经理LXC接到了一个定餐大单,可把大家乐坏了!员工们齐心协力按要求准备好了套餐正准备派送时,突然碰到一个棘 ...

  6. luogu P1069 细胞分裂

    题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家.现在,他正在为一个细胞实 验做准备工作:培养细胞样本. Hanks 博士手里现在有 N 种细胞,编号从 1~N,一个 ...

  7. 【poj1149】 pigs 网络流最大流问题

    描述 Description 尼克在一家养猪场工作,这家养猪场共有M间锁起来的猪舍,由于猪舍的钥匙都给了客户,所以尼克没有办法打开这些猪舍,客户们从早上开始一个接一个来购买生猪,他们到达后首先用手中的 ...

  8. 第九章 Android-UI组件(2)

    一.图像视图(ImageView) 布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayo ...

  9. [android]加载大量图片避免OOM

    原理是事先取得图片的长宽,直接读出缩略图. BitmapFactory.Options options = new BitmapFactory.Options(); options.inPreferr ...

  10. Spark-shell启动脚本解读

    #!/usr/bin/env bash # # Licensed to the Apache Software Foundation (ASF) under one or more # contrib ...