解決Snackbar無法進行跨頁面展示的問題
效果:
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();
}
}
}
相關文章
- 解決bootstrap的modal使用Esc鍵無法關閉頁面問題boot
- apache ambari web頁面無法訪問解決辦法ApacheWeb
- 解決Spring Boot無法跳轉jsp頁面問題Spring BootJS
- IDEA解決JSP頁面無法使用EL表示式問題IdeaJS
- 無法訪問請求的頁面,因為該頁的相關配置資料無效問題的解決
- 官方Chrome擴充套件頁面無法訪問解決辦法Chrome套件
- 跨域問題解決辦法跨域
- 解決無法使用VI的問題
- 頁面無法輸入多個空格解決方案
- 解決Centos無法yum源的問題CentOS
- 解決下載的CHM檔案無法顯示網頁問題網頁
- gmail無法訪問問題解決--FGWAI
- 【問題&解決】手機網頁Html程式碼實現(解決顯示頁面很小的問題)網頁HTML
- 解決寶塔皮膚無法訪問的問題?
- springboot中靜態頁面無法訪問及return無法重定向問題Spring Boot
- PHP中SESSION丟失(不能跨頁面傳遞)解決辦法PHPSession
- 解決ASM無法啟動問題ASM
- SaaS無法解決“關鍵”問題
- 解決codeblocks無法除錯的問題BloC除錯
- 解決跨域問題跨域
- 解決django中超連結頁面不跳轉的問題Django
- 解決WordPress頁面錯位問題的實用技巧
- 有模有樣解決Flutter裡Webview無法訪問HTTP頁面的問題FlutterWebViewHTTP
- 解決split無法得到空字串問題字串
- Parallels Tools 無法安裝問題解決Parallel
- win10提示嗯...無法訪問此頁面怎麼辦_win10 edge提示嗯...無法訪問此頁面的解決方法Win10
- ajax跨域訪問時,set-cookie無效問題的解決跨域Cookie
- 防止跨域問題無法訪問網址跨域
- 解決JS跨域訪問的問題JS跨域
- AD18無法模擬問題的解決
- 解決VisualStudio無法除錯的問題除錯
- 解決OBJC_CLASS_$_MBProgressHUD無法引用的問題OBJ
- 解決ASM磁碟組無法掛載的問題ASM
- 解決ORACLE無法啟動安裝的問題Oracle
- 關於listener無法啟動的問題解決
- 如何解決目前微信小遊戲無法進行網路請求的問題遊戲
- iframe下重新整理頁面無法重新整理當前頁面的解決辦法
- 搞懂:前端跨域問題JS解決跨域問題VUE代理解決跨域問題原理前端跨域JSVue