Menu
Woocommerce Menu

手动管理activity栈,一次使用Kotlin实现酷炫多选操作的尝试

0 Comment

本篇文章讲述的是android中时间,地址滚轮选择器的使用,文章参考自android-pickers本文也是基于对这个库中日期选择器的使用给一个简单的介绍。

“手机上的多选很难操作”,我们的设计师Vitaly
Rubtsov如是说。大多数应用中的多选方案 -Telegram, Apple Music,
Spotify等等- 通常都不是那么灵活,用起来也不舒服。

需求:某层次很深的一个acticity有个退出登录按钮难点:for循环finish太不优雅了实现:

讲述的内容包括:

比如,当你在Apple
Music中创建自己的播放列表时,如果不切换屏幕或者无尽的滚动一遍被选中的歌曲,你都不清楚自己选择了哪些歌曲。

import android.app.Activity;import java.util.Stack;/** * Created by jing on 17/5/24. * 管理 Activity 的 视图栈 */public class KapApplicationActivitysQueue { private KapApplicationActivitysQueue(){} private static KapApplicationActivitysQueue queue = new KapApplicationActivitysQueue(); public static KapApplicationActivitysQueue ShareActivityQueue(){ return queue; } private Stack<Activity> activityStack = new Stack<Activity>(); /** 获取当前的activity,不做任何操作 */ public Activity currentActivity() { return activityStack.lastElement(); } /** * 只有这俩方法 操作 activityStack不能手动调用(都是自动添加删除的) * addActivity 添加Activity到堆栈 * popCurrentActivity 结束当前Activity * currentActivity */ public void addActivity(Activity activity) { activityStack.push; } public void popCurrentActivity(Activity activity) { activityStack.remove; } /** * 下面的这些方法都是辅助方法 (注意防止当前activity结束当前的导致crash) * 获取当前Activity(堆栈中最后一个压入的) */ // 结束指定的Activity public void finishOneActivity(Activity activity) { if (activity != null) { if(!activity.isFinishing { activity.finish(); } } } // 结束指定类名的Activity public void finishOneActivity(Class<?> cls) { for (Activity activity : activityStack) { if (!activity.getClass().equals continue; finishOneActivity; return; } } /** 结束至指定类名Activity */ public void finishToActiovity(Class<?> cls){ while (!activityStack.lastElement().getClass().equals{ activityStack.pop().finish(); if (activityStack.size return; } } /** 结束除指定类名的所有Activity */ public void finishExcludeActivityAllActivity(Class<?> cls) { for (Activity activity : activityStack) { if (activity == null) continue; if (activity.getClass().equals continue; finishOneActivity; } } /** 结束所有Activity */ public void finishAllActivity() { for (Activity activity : activityStack) { if (activity == null) continue; finishOneActivity; } }}

public class KapApplication extends Application{/** * activity栈管理 * */ private KapApplicationActivitysQueue activitysQueue = KapApplicationActivitysQueue.ShareActivityQueue(); private ActivityLifecycleCallbacks activityLifecycleCallbacks = new ActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle bundle) { activitysQueue.addActivity;//创建 } @Override public void onActivityDestroyed(Activity activity) { activitysQueue.popCurrentActivity;// 推出 } @Override public void onActivityStarted(Activity activity) { } @Override public void onActivityResumed(Activity activity) { } @Override public void onActivityPaused(Activity activity) { } @Override public void onActivityStopped(Activity activity) { } @Override public void onActivitySaveInstanceState(Activity activity, Bundle bundle) { } }; // 下面是辅助方法,仅供参考 /** 会退至至指定的activity(此class成为当前显示的) */ public static void popToActivity(Class cls){ KapApplicationActivitysQueue activitysQueue = getInstance().activitysQueue; activitysQueue.finishToActiovity; } /** 获取当前activity */ public static Activity currentActivity(){ KapApplicationActivitysQueue activitysQueue = getInstance().activitysQueue; return activitysQueue.currentActivity(); } /** 切换根视图登录 */ public static void goLoginActivity(){ Class openClass = KapLoginActivity.class; changeRootActivityByClass(openClass); } /** 切换根视图主页 */ public static void goMainActivity(){ Class openClass = KapMainActivity.class; changeRootActivityByClass(openClass); } private static void changeRootActivityByClass(Class openClass){ KapApplicationActivitysQueue activitysQueue = getInstance().activitysQueue; Activity currentActivity = activitysQueue.currentActivity(); currentActivity.startActivity(new Intent(currentActivity, openClass)); activitysQueue.finishExcludeActivityAllActivity(openClass); }}
  • 库依赖
  • 混淆注意
  • 代码中运用

如果我们想使用筛选功能事情就变得更糟糕了。应用了一个筛选条件之后,列表的结构可能会发生改变,选中的item也许根本就不会显示。Vitaly决定使用他自己的多选概念设计(最早发布在Dribbble)来解决这个问题。

使用:

标签:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图