解決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