最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用反射機制控制Toast的顯示時間

 更新時間:2018年08月28日 09:13:35   作者:droid_zhlu  
這篇文章主要為大家詳細介紹了使用反射機制控制Toast的顯示時間,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文為大家分享了使用反射機制控制Toast顯示時間的具體代碼,供大家參考,具體內(nèi)容如下

1、Toast源碼分析:

      Toast的默認view是在transient_notification.xml中定義的一個TextView,如果需要設(shè)置Toast的界面,可以通過setView方法實現(xiàn);如果需要設(shè)置Toast默認顯示的位置,可以通過setGravity或者setMargin方法進行設(shè)置,值得一提的是setMargin方法的參數(shù)范圍是0-1即它是屏幕的百分比,如setMargin(0.1,0.1)。

      Toast 的構(gòu)造函數(shù),會實例化TN對象,TN對象擁有show和hide兩個方法,可以控制Toast的顯示和消失。那么又是什么來完成調(diào)用和何時調(diào)用這兩個方法的呢?我們可以從Toast的show方法中找到答案:

public void show() {
    if (mNextView == null) {
      throw new RuntimeException("setView must have been called");
    }
 
    INotificationManager service = getService();
 
    String pkg = mContext.getPackageName();
 
    TN tn = mTN;
 
    try {
      service.enqueueToast(pkg, tn, mDuration);
    } catch (RemoteException e) {
      // Empty
    }
  }

該方法,首先會判斷待顯示的view對象是否為null;然后獲取單例的INotificationManager的對象,最后把當前Toast的請求加入到顯示隊列,同時把該Toast需要顯示的時間也傳了進去。enqueueToast的方法如下:

public void enqueueToast(java.lang.String pkg, android.app.ITransientNotification callback, int duration) throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeString(pkg);
_data.writeStrongBinder((((callback!=null))?(callback.asBinder()):(null)));
_data.writeInt(duration);
mRemote.transact(Stub.TRANSACTION_enqueueToast, _data, _reply, 0);
_reply.readException();
}
finally {
_reply.recycle();
_data.recycle();
}
}

可以看到該方法,通過transact方法調(diào)用了底層代碼,即使用了binder的機制。service最終根據(jù)duration,調(diào)用TN的show和hide方法顯示和隱藏Toast界面。

2、如何修改Toast的顯示時間

      Toast默認有兩種顯示時間,分別是LENGTH_SHORT和LENGTH_LONG。如果我們需要Toast顯示的時間,小于LENGTH_SHORT,那么非常容易實現(xiàn),直接調(diào)用Toast的cancel方法即可。那么我們?nèi)绻隩oast的顯示時間大于LENGTH_LONG,那就沒有辦法實現(xiàn)了,因為何事調(diào)用TN的hide方法,不是由你控制的。

      下面通過Java的反射機制,拿到TN的show和hide方法,自己來控制Toast的顯示和隱藏。

public class ReflectToast {
  Context mContext;
 
  private Toast mToast;
  private Field field;
  private Object obj;
  private Method showMethod, hideMethod;
 
  public ReflectToast(Context c, View v) {
    this.mContext = c;
    mToast = new Toast(mContext);
    mToast.setView(v);
 
    reflectionTN();
  }
 
  public void show() {
    try {
      showMethod.invoke(obj, null);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
 
  public void cancel() {
    try {
      hideMethod.invoke(obj, null);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
 
  private void reflectionTN() {
    try {
      field = mToast.getClass().getDeclaredField("mTN");
      field.setAccessible(true);
      obj = field.get(mToast);
      showMethod = obj.getClass().getDeclaredMethod("show", null);
      hideMethod = obj.getClass().getDeclaredMethod("hide", null);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

在外部,我們可以調(diào)用ReflectToast的show和cancel方法,來實現(xiàn)控制Toast的顯示和隱藏。

為了不讓大家再出錯,給出調(diào)用代碼如下:

public class MainActivity extends Activity {
  ReflectToast toast;
  boolean isShown = false;
  
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final TextView tView = new TextView(this);
    tView.setText("ReflectToast !!!");
    toast = new ReflectToast(this, tView);
    
    findViewById(R.id.click).setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
        if(isShown){
          toast.cancel();
          isShown = false;
        }else{ 
          toast.show();
          isShown = true;
        }
      }
    });
  }
}

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android 個人理財工具六:顯示賬單明細 下

    Android 個人理財工具六:顯示賬單明細 下

    本文主要節(jié)誒是Android 個人理財工具顯示賬單明細,主要實現(xiàn)此窗口的查詢和刪除功能,這里提供實現(xiàn)代碼,有興趣的小伙伴可以參考下
    2016-08-08
  • 快速關(guān)閉android studio的自動保存功能教程

    快速關(guān)閉android studio的自動保存功能教程

    這篇文章主要介紹了快速關(guān)閉android studio的自動保存功能教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • Android View進行手勢識別詳解

    Android View進行手勢識別詳解

    本文主要介紹 Android View進行手勢識別,這里整理了相關(guān)資料和簡單示例,有興趣的小伙伴可以參考下
    2016-08-08
  • android ocr——身份證識別的功能實現(xiàn)

    android ocr——身份證識別的功能實現(xiàn)

    本篇文章主要介紹了android ocr——身份證識別的功能實現(xiàn),具有一定的參考價值,有需要的可以了解一下。
    2016-11-11
  • Android相機啟動加速詳解

    Android相機啟動加速詳解

    本篇文章給大家詳細分析了Android實現(xiàn)相機啟動加速的相關(guān)知識點內(nèi)容以及實例代碼,有興趣的朋友參考下。
    2018-07-07
  • Android實現(xiàn)圖片預覽與保存功能

    Android實現(xiàn)圖片預覽與保存功能

    在App開發(fā)中,通常為了省流提高加載速度提升用戶體驗我們通常在列表中或新聞中的插圖都是以縮略圖壓縮過的圖片來進行展示,當用戶點擊圖片時我們再去加載真正像素的大圖讓用戶預覽。本文將利用Flutter實現(xiàn)這一功能,需要的可以參考一下
    2022-04-04
  • android電源信息查看(電量、溫度、電壓)實例代碼

    android電源信息查看(電量、溫度、電壓)實例代碼

    這篇文章主要介紹了android電源信息查看方法,以實例形式較為詳細的分析了Android實現(xiàn)電源電量、電壓、溫度等信息查看的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • Android 7.0調(diào)用相機崩潰詳解及解決辦法

    Android 7.0調(diào)用相機崩潰詳解及解決辦法

    這篇文章主要介紹了 Android 7.0調(diào)用相機崩潰詳解及解決辦法的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • Android?Dispatchers.IO線程池深入刨析

    Android?Dispatchers.IO線程池深入刨析

    這篇文章主要為大家介紹了Android?Kotlin線程池Dispatchers.IO原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-08-08
  • Android支付寶支付封裝代碼

    Android支付寶支付封裝代碼

    這篇文章主要介紹了Android支付寶支付封裝代碼,Android支付的時候肯定會使用支付寶進行支付,封裝可以簡化操作步驟,感興趣的小伙伴們可以參考一下
    2015-12-12

最新評論

岳普湖县| 托克逊县| 商南县| 昔阳县| 绵竹市| 喀什市| 乌拉特前旗| 萝北县| 巴东县| 四川省| 泗水县| 惠水县| 蕲春县| 大英县| 宁津县| 宜君县| 兴海县| 三江| 长春市| 东台市| 抚顺县| 临城县| 施甸县| 洛阳市| 项城市| 中超| 宜阳县| 鸡泽县| 义马市| 临潭县| 三亚市| 宽城| 新源县| 肥东县| 沙湾县| 建瓯市| 陆丰市| 峡江县| 阳朔县| 江达县| 灵寿县|