效果:
snackBar需要依赖activity或者dialog展示,所以当activity被Finish掉时,snackBar也会被销毁,然而,开发过程中,我们经常需要有这样的需求:
showSnackbar("显示Snckbar");
finish();
而这样写的结果就是snackBar会一闪而过,用户来不及看,snackBar就已经被销毁,这明显不是我们希望看到的,当然我们可以改用toast,但toast也有缺陷,7.1之后,如果没有通知权限,则无法显示。
其实解决Snackbar跨页显示的方法也很简单,只要获取activity栈的第二个activity,并在第二个activity显示snackBar,那么当栈顶的activity被销毁后,由于snackBar是依赖的是第二个activity,所以snackBar依然会显示
有了思路,那么解决方法也就简单多了,使用ActivityLifecycleCallbacks记录下acitity的生命周期,当栈顶的activity被销毁时,第二个activity显示snackBar就行,由于snackBar只在一个activity显示,也就不会有闪烁的问题了
为了配合ActivityLifecycleCallbacks,我写了一个SnackBarHelper
首先,在Application的onCreate()方法里调用SnackBarHelper.init(this);
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
SnackBarHelper.init(this);
}
}
然后根据需要调用:
SnackBarHelper.show("显示SnackBar");
or
SnackBarHelper.finishShow("显示SnackBar");
finish();
SnackBarHelper源码:
import android.app.Activity;
import android.app.Application;
import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.view.View;
import java.util.ArrayList;
import java.util.List;
public class SnackBarHelper {
private Application application;
private static List<Activity> activities = new ArrayList<>();
public static void init(Application application){
application.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
activities.add(activity);
}
@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 outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
activities.remove(activity);
}
});
}
public static void show(String text){
Snackbar.make(activities.get(activities.size()-1).getWindow().getDecorView(),text,Snackbar.LENGTH_SHORT).show();
}
public static void finishShow(String text){
if(activities.size()>=2){
Snackbar.make(activities.get(activities.size()-2).getWindow().getDecorView(),text,Snackbar.LENGTH_SHORT).show();
}
}
}