1. 程式人生 > >解決android7.0+ 自定義Toast時長,但是toast不顯示問題

解決android7.0+ 自定義Toast時長,但是toast不顯示問題

重點在於解決部分機型自定義Toast 時長不顯示問題
在部分手機上會出現自定義時長的Toast不顯示,從而導致出現bug(排除Toast許可權被關閉情況),這樣我們需要自定義Toast 程式碼如下

public class ToastUtils {
    private static final String TAG = ToastUtils.class.getSimpleName();
    private static TextView tv;
    public static final int LENGTH_LONG = 3500; // 3.5 seconds
    public static
final int LENGTH_SHORT = 2000; // 2 seconds private static View mNextView; private static int mGravity, mX, mY; private static final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams(); private static WindowManager mWM; private static Handler mHanlder = new Handler
(); /** * init * @param context */ @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) private static void init(Context context) { mY = context.getResources().getDimensionPixelSize( R.dimen.toast_y_offset); mGravity = context.getResources().getInteger
( R.integer.config_toastDefaultGravity); LayoutInflater inflate = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mNextView = inflate.inflate(R.layout.transient_notification, null); TextView tv = (TextView) mNextView.findViewById(android.R.id.message); mParams.height = WindowManager.LayoutParams.WRAP_CONTENT; mParams.width = WindowManager.LayoutParams.WRAP_CONTENT; mParams.format = PixelFormat.TRANSLUCENT; mParams.windowAnimations = R.style.Animation_Toast; mParams.type = WindowManager.LayoutParams.TYPE_TOAST; mParams.setTitle("Toast"); mParams.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; mWM = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); // We can resolve the Gravity here by using the Locale for getting // the layout direction final Configuration config = mNextView.getContext().getResources().getConfiguration(); final int gravity = Gravity.getAbsoluteGravity(mGravity, config.getLayoutDirection()); mParams.gravity = gravity; if ((gravity & Gravity.HORIZONTAL_GRAVITY_MASK) == Gravity.FILL_HORIZONTAL) { mParams.horizontalWeight = 1.0f; } if ((gravity & Gravity.VERTICAL_GRAVITY_MASK) == Gravity.FILL_VERTICAL) { mParams.verticalWeight = 1.0f; } mParams.x = mX; mParams.y = mY; // mParams.verticalMargin = mVerticalMargin; // mParams.horizontalMargin = mHorizontalMargin; mParams.packageName = context.getPackageName(); } /** * Show the view for the specified duration. * @param context * @param text * @param duration */ public static void show(final Context context, final CharSequence text, int duration) { if (context == null) { throw new RuntimeException("context is null"); } if (mWM == null || mNextView == null) { init(context); } mHanlder.removeCallbacks(cancelRunable); mHanlder.post(new Runnable() { @Override public void run() { ((TextView) mNextView.findViewById(android.R.id.message)).setText(text); if (mNextView.getParent() != null) mWM.removeView(mNextView); mWM.addView(mNextView, mParams); } }); mHanlder.postDelayed(cancelRunable, duration); } private static Runnable cancelRunable = new Runnable() { @Override public void run() { cancel(); } }; /** * cancel toast */ public static void cancel() { if (mNextView != null && mNextView.getParent() != null) mWM.removeViewImmediate(mNextView); } }

佈局檔案如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:paddingLeft="@dimen/dimens_15_dp"
   android:paddingRight="@dimen/dimens_15_dp"
   android:orientation="vertical">

   <TextView
       android:id="@+id/tv_toast_name"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:background="@drawable/shape_toast"
       android:gravity="center"
       android:layout_gravity="right"
       android:paddingBottom="10dp"
       android:paddingLeft="30dp"
       android:paddingRight="30dp"
       android:paddingTop="10dp"
       android:text=""
       android:textColor="#FFFFFF"
       android:textSize="12sp" />

</LinearLayout>

這中間需要注意的 不能造成視窗洩漏以及記憶體洩漏(主要是 Context洩漏)。其他需求可以自己修改。

相關推薦

解決android7.0+ 定義Toast但是toast顯示問題

重點在於解決部分機型自定義Toast 時長不顯示問題 在部分手機上會出現自定義時長的Toast不顯示,從而導致出現bug(排除Toast許可權被關閉情況),這樣我們需要自定義Toast 程式碼如下 public class ToastUtils { pr

解決Android7.0 更新安裝包能自動安裝問題

專案中發現在自動更新功能的時候,下載好了apk的檔案後在android7.0系統中不能自動跳到安裝介面,後來搜尋了一番解決了問題,但感覺沒有描述清楚,所以補充一下。 每個Android版本的釋出,對於安全性問題的要求越來越高,也為Android程式設計師增加了額外的工作量。Android6.0引入動態許可權控

解決jasperreports中定義字型在linux沒有生效和加粗問題

我的jasper的maven配置 <dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports</artifactId&

高德地圖定義 marker 佈局里加載網路圖片顯示的問題

服務端返回一組 marker 陣列,for 迴圈裡新增自定義佈局 marker到地圖上 要注意兩個原因不顯示 marker 1,要在圖片載入完後再把 佈局view新增到 marker 上 2,markerOption必須是 for 迴圈裡的變數,不能是全域性變數,不然

[已解決]IE按F12工作列會出現“開發人員工具”按鈕視窗顯示

原創內容: 說實話這個問題是我去年碰到了,怎麼都搜不到解決方案,當時有個網友說是被移動到螢幕以外去了,但沒說怎麼解決,網上常見的解決辦法(N多複製貼上的,真無聊)有: ctrl+p會把這個弄到瀏覽器裡面,不好用 右擊工作列按鈕把他最大化,但是想用指標選取瀏覽器中的元素時不方便 &nb

checkbox屬性checked="checked"已有顯示打勾的解決辦法

在做許可權管理的時候,做了一個功能,就是當勾選欄目,把所有的許可權全勾上。剛開始使用瞭如下程式碼: function check(id,check) { if (check) { $("." + id).find("input[type='checkbox']").a

非常實用的定義佈局定義顯示的頂部toast

最近在工作中需要彈出頂部toast且顯示時間不固定。從而寫了下面的一個模擬toast的動畫: 先看動畫: public void isShowToast(final boolean isShow,View mToastV) { final int marinTop = 0;//距離頂

audio定義樣式控制操作面板的暫停播放獲取音訊的以及根據進行進度條展示

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>audio例項</title> <script src="./js

關於Microsoft SQL Server Management Studio定義安裝能更改安裝路徑或只能更改一個或兩個問題的解決

1.首先,肯定你在裝SQLServer之前裝了VS,然後你的C盤裡面會在裡面新建了SQLServer的資料夾,所以你在後面裝SQLServer的時候只能更改一個路徑。 2.解決方法:解除安裝VS,然後再裝SQLServer,進入控制面板,然後把 這些解除安裝了(我圖片裡面

goland匯入定義出錯(一招解決問題)

使用goland編寫go語言程式的時候,發現針對自定義的包無法引入。如下圖所示: 具體錯誤也就是main.go:13:2: cannot find package "grpool" in any of: 然後就各種在網上查詢,大多數也都講得很不清楚,最後在網上找到一個說的比較詳細的

小程式使用selectComponent獲取定義元件返回null(分析和解決方法)

一、原因:        元件所在的佈局層級不同,該元件被建立的時間會有所不同,意味著ready(元件生命週期函式,元件佈局完成後執行)被呼叫的時間有所不同。由於元件建立完成的時間晚於頁面建立完成,即元件生命週期函式的ready被執行的時間晚於頁面生命週期

Android定義圖片選取器類似微信樣式帶裁剪功能適配Android7.0

不知道為什麼README文件在github上排版格式全亂了,所以寫個部落格當文件看吧 ImagePicker 這是一個Android使用的自定義圖片選擇器,眾所周知,Android碎片化問題嚴重,其中就包括圖片選擇的問題,呼叫系統相簿選擇圖片或裁剪圖片時

vue定義form控制元件解決vue+layui組合checkbutton和radiobutton事件被覆蓋問題

vue+layui組合時checkbutton和radiobutton事件會被layui覆蓋,導致資料無法繫結,需要自定義form表單控制元件,如下: VRadio.vue <template&

Android 5.0 定義dialog 背景透明解決方法

在android 5.0 以上的版本中,自定義的dialog如果有圓角的話背景底部會出現白色,如圖: 解決方法是在style.xml檔案中定義一個dialog的樣式,程式碼如下: <s

vue.js2.0 定義組件初體驗

最新 解綁 然而 blog bool template 警告 rem 組件 理解 組件(Component)是 Vue.js 最強大的功能之一。組件可以擴展 HTML 元素,封裝可重用的代碼。在較高層面上,組件是自定義元素, Vue.js 的編譯器為它添加特殊功能。在有些

IIS ajax CORS 訪問發送定義Header分析

nbsp post true cal 後臺 config -a coo function 場景: a站:http://127.0.0.1/a b站:http://localhost/b (IIS7.5) a站用ajax訪問b的資源,代碼如下: $.ajaxSetu

vue.2.0-定義全局組件

new turn welcome 文件夾 微軟 ont return con def App.vue <template> <div id="app"> <h3>welcome vue-loading</h3>

Struts2配置攔截器定義拋異常:Unable to load configuration. - interceptor-ref - file:/D:/tomcat_install/webapps/crm/WEB-INF/classes/struts.xml

註意 其他 默認 才會 eba staf -i sta fault 代碼如下: <interceptors> <!-- 註冊自定義攔截器 --> <interceptor name="LoginInterceptor" class="co

定義流程gooflow2.0+定義表單

log ges bapi cnblogs 語句 參與者 源碼 -1 通過 一、功能簡介 gooflow功能清單1、自定義流程繪制2、自定義屬性添加3、支持3種步驟類型普通審批步驟自動決策步驟手動決策步驟 4、決策方式(支持js決策,sql語句決策) 5、審批人員參與方

python解決導入定義庫失敗: ModuleNotFoundError: No module named 'MyLib'

ear 安裝 pat name err under code 自定義庫 安裝路徑 python安裝目錄:...\python_3_6_1_64bit 新建文件:chenyeubai.pth,寫入庫所在的絕對路徑E:\workSpace\my_code\learn\myLib