Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

添加侧滑 #34

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
添加侧滑
zhumingwei committed Oct 18, 2018

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
commit 64dbe5e081d04073d8f6df25403ed9d9bdbff6e0
5 changes: 4 additions & 1 deletion .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'

android {
compileSdkVersion rootProject.ext.android.compileSdkVersion
Original file line number Diff line number Diff line change
@@ -108,5 +108,12 @@ public void onError(Throwable e) {
progressDialog.dismiss();
}
});

}

@Override
public boolean supportSlideBack() {
return false;
}

}
Original file line number Diff line number Diff line change
@@ -54,4 +54,9 @@ public void onPropertyChanged(Observable observable, int i) {
}
});
}

@Override
public boolean supportSlideBack() {
return false;
}
}
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -7,6 +7,7 @@ buildscript {
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.70"
// classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
// classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
// classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3'
2 changes: 2 additions & 0 deletions config.gradle
Original file line number Diff line number Diff line change
@@ -13,6 +13,7 @@ ext {
versions = [
"support-version": "27.0.2",
"junit-version" : "4.12",
"kt-version":"1.2.70",
]
//support配置
support = [
@@ -25,6 +26,7 @@ ext {
'design' : "com.android.support:design:${versions["support-version"]}",
'animated-vector-drawable': "com.android.support:animated-vector-drawable:${versions["support-version"]}",
'junit' : "junit:junit:${versions["junit-version"]}",
'kotlinjdk' : "org.jetbrains.kotlin:kotlin-stdlib-jdk7:${versions["kt-version"]}",
]
//依赖第三方配置
dependencies = [
5 changes: 5 additions & 0 deletions mvvmhabit/build.gradle
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'

android {
compileSdkVersion rootProject.ext.android.compileSdkVersion
buildToolsVersion rootProject.ext.android.buildToolsVersion
@@ -58,6 +62,7 @@ dependencies {
api(rootProject.ext.dependencies["bindingcollectionadapter-recyclerview"]) {
exclude group: 'com.android.support'
}
api rootProject.ext.support.kotlinjdk
//Google LiveData和ViewModel组件
api rootProject.ext.dependencies["lifecycle-extensions"]
annotationProcessor rootProject.ext.dependencies["lifecycle-compiler"]
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package me.goldze.mvvmhabit.base;

import android.app.Activity;
import android.arch.lifecycle.Observer;
import android.arch.lifecycle.ViewModel;
import android.arch.lifecycle.ViewModelProviders;
@@ -9,11 +10,14 @@
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;
import android.view.MotionEvent;

import com.afollestad.materialdialogs.MaterialDialog;
import com.google.gson.Gson;
import com.trello.rxlifecycle2.components.support.RxAppCompatActivity;

import org.jetbrains.annotations.NotNull;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Map;
@@ -22,6 +26,7 @@
import me.goldze.mvvmhabit.utils.KLog;
import me.goldze.mvvmhabit.utils.MaterialDialogUtils;
import me.goldze.mvvmhabit.base.BaseViewModel.ParameterField;
import me.goldze.mvvmhabit.utils.swipehelper.SwipeWindowHelper;


/**
@@ -30,10 +35,11 @@
* 这里根据项目业务可以换成你自己熟悉的BaseActivity, 但是需要继承RxAppCompatActivity,方便LifecycleProvider管理生命周期
*/

public abstract class BaseActivity<V extends ViewDataBinding, VM extends BaseViewModel> extends RxAppCompatActivity implements IBaseActivity {
public abstract class BaseActivity<V extends ViewDataBinding, VM extends BaseViewModel> extends RxAppCompatActivity implements IBaseActivity, SwipeWindowHelper.SlideBackManager {
protected V binding;
protected VM viewModel;
private MaterialDialog dialog;
private SwipeWindowHelper mSwipeWindowHelper;

@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -50,6 +56,14 @@ protected void onCreate(Bundle savedInstanceState) {
initViewObservable();
//注册RxBus
viewModel.registerRxBus();
//侧滑
initSwipe();
}

protected void initSwipe() {
mSwipeWindowHelper = new SwipeWindowHelper(this);

AppManager.getAppManager().addActivity(this);
}

@Override
@@ -62,6 +76,7 @@ protected void onDestroy() {
viewModel.removeRxBus();
viewModel = null;
binding.unbind();
AppManager.getAppManager().finishActivity(this);
}

/**
@@ -214,6 +229,32 @@ public void startContainerActivity(String canonicalName) {
startActivity(intent);
}

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (!supportSlideBack() || mSwipeWindowHelper == null) {
return super.dispatchTouchEvent(ev);
} else {
return mSwipeWindowHelper.processTouchEvent(ev) || super.dispatchTouchEvent(ev);
}
}

@NotNull
@Override
public Activity getSlideActivity() {
return this;
}

@Override
public boolean supportSlideBack() {
return true;
}

@Override
public boolean canBeSlideBack() {
return true;
}


/**
* =====================================================================
**/
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
package me.goldze.mvvmhabit.utils.swipehelper

import android.app.Activity
import java.util.*
import kotlin.collections.LinkedHashMap

class AppManager(private val activityStack: Stack<Activity>, private val activityMap: LinkedHashMap<String, Activity>) {

companion object {
val instance by lazy {
AppManager(Stack(), LinkedHashMap());
}
}

fun getStack(): Stack<Activity> = activityStack

fun getActivitySize(): Int = activityStack.size

fun addActivity(activity: Activity, key: String?) {
key?.let {
if (activityMap.containsKey(key)) {
activityMap.get(key)?.finish()
activityMap.put(key, activity)
}
addActivity(activity)
} ?: kotlin.run {
addActivity(activity)
}
}

private fun addActivity(activity: Activity) {
if (activityStack.contains(activity)) {
activityStack.remove(activity)
}
activityStack.add(activity)
}

fun currentActivity(): Activity {
return activityStack.lastElement()
}

fun finishActivity(activity: Activity, key: String?) {
key?.let {
finishActivity(activity)
} ?: kotlin.run {
if (activityMap.containsKey(key)) {
activityMap.remove(key)
}
finishActivity(activity)
}

}

private fun finishActivity(activity: Activity?) {
activityStack.remove(activity)
}

fun finishActivity() {
val activity = currentActivity()
finishActivity(activity)
removeIfInMap(activity)
}

private fun removeIfInMap(activity: Activity) {
activityMap.values.forEach {
if (it == activity) {
it.finish()
}
}
}

/**
* 结束指定类名的Activity
*/
fun finishActivity(cls: Class<*>) {
synchronized(activityStack) {
val iterator = activityStack.iterator()
while (iterator.hasNext()) {
val activity = iterator.next()
if (activity.javaClass == cls) {
iterator.remove()
if (!activity.isFinishing) {
removeIfInMap(activity)
activity.finish()
}
}
}

}
}

/**
* 结束所有Activity
*/
fun finishAllActivity() {
if (activityStack == null || activityStack.size == 0)
return

var i = 0
val size = activityStack.size
while (i < size) {
if (null != activityStack[i]) {
val activity = activityStack[i]
if (activity != null && !activity.isFinishing) {
activity.finish()
}
// activityStack.get(i).finish();
}
i++
}
activityStack.clear()
activityMap.clear()
}

fun removeAllWithout(target: Activity) {
synchronized(activityStack) {
val iterator = activityStack.iterator()
while (iterator.hasNext()) {
val activity = iterator.next()
if (activity !== target) {
iterator.remove()
if (!activity.isFinishing) {
removeIfInMap(activity)
activity.finish() // 否则会对一个Activity调用两次finish
}
}
}
}
}

/**
* 退出应用程序
*/
// fun AppExit(context: Context) {
// try {
// finishAllActivity()
// val activityMgr = context
// .getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
// activityMgr.killBackgroundProcesses(context.packageName)
// System.exit(0)
// } catch (e: Exception) {
// }
//
// }


fun getPreActivity(): Activity? {
val size = activityStack.size
return if (size < 2) null else activityStack.elementAt(size - 2)
}


}

Large diffs are not rendered by default.