解決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();
}
}
}
相關文章
- 解決Spring Boot無法跳轉jsp頁面問題Spring BootJS
- IDEA解決JSP頁面無法使用EL表示式問題IdeaJS
- 無法訪問請求的頁面,因為該頁的相關配置資料無效問題的解決
- 跨域問題解決辦法跨域
- 解決無法使用VI的問題
- 解決codeblocks無法除錯的問題BloC除錯
- 解決Centos無法yum源的問題CentOS
- springboot中靜態頁面無法訪問及return無法重定向問題Spring Boot
- 解決ASM無法啟動問題ASM
- 解決跨域問題跨域
- 解決 raw.githubusercontent.com 無法訪問的問題Github
- 解決寶塔皮膚無法訪問的問題?
- 有模有樣解決Flutter裡Webview無法訪問HTTP頁面的問題FlutterWebViewHTTP
- springboot無法訪問templates下的html頁面和Error resolving template “xxx“的解決方案Spring BootHTMLError
- Parallels Tools 無法安裝問題解決Parallel
- 解決split無法得到空字串問題字串
- 解決JS跨域訪問的問題JS跨域
- AD18無法模擬問題的解決
- 防止跨域問題無法訪問網址跨域
- 搞懂:前端跨域問題JS解決跨域問題VUE代理解決跨域問題原理前端跨域JSVue
- WebSocket跨域問題解決Web跨域
- Java解決跨域問題Java跨域
- Flask解決跨域問題Flask跨域
- CROS 解決跨域問題ROS跨域
- SignalR跨域問題解決SignalR跨域
- cors解決跨域問題CORS跨域
- Luffy - 解決跨域問題跨域
- 解決 sublime text3 執行python檔案無法input的問題Python
- win10提示嗯...無法訪問此頁面怎麼辦_win10 edge提示嗯...無法訪問此頁面的解決方法Win10
- 解決WordPress頁面錯位問題的實用技巧
- 解決SpringBoot頁面localhost 404問題,即Whitelabel Error Page問題Spring BootlocalhostError
- Windows無法配置此無線連線這個問題的解決辦法Windows
- 解決vscode安裝後無法啟動的問題VSCode
- 記錄一次無法很好解決的問題
- 解決 Python 指令碼無法生成結果的問題Python指令碼
- IDEA中Lombok無法生效的問題及解決方法IdeaLombok
- 解決idea中無法識別主類的問題Idea
- goland中npm無法使用的問題及解決方法GoLandNPM