解決Snackbar無法進行跨頁面展示的問題

jingzz1發表於2019-01-18

效果:

 

 

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();
        }
    }

}

 

相關文章