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

使用反射機(jī)制控制Toast的顯示時(shí)間

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

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

1、Toast源碼分析:

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

      Toast 的構(gòu)造函數(shù),會(huì)實(shí)例化TN對(duì)象,TN對(duì)象擁有show和hide兩個(gè)方法,可以控制Toast的顯示和消失。那么又是什么來(lái)完成調(diào)用和何時(shí)調(diào)用這兩個(gè)方法的呢?我們可以從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
    }
  }

該方法,首先會(huì)判斷待顯示的view對(duì)象是否為null;然后獲取單例的INotificationManager的對(duì)象,最后把當(dāng)前Toast的請(qǐng)求加入到顯示隊(duì)列,同時(shí)把該Toast需要顯示的時(shí)間也傳了進(jìn)去。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();
}
}

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

2、如何修改Toast的顯示時(shí)間

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

      下面通過(guò)Java的反射機(jī)制,拿到TN的show和hide方法,自己來(lái)控制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方法,來(lái)實(shí)現(xiàn)控制Toast的顯示和隱藏。

為了不讓大家再出錯(cuò),給出調(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;
        }
      }
    });
  }
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android 個(gè)人理財(cái)工具六:顯示賬單明細(xì) 下

    Android 個(gè)人理財(cái)工具六:顯示賬單明細(xì) 下

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

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

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

    Android View進(jìn)行手勢(shì)識(shí)別詳解

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

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

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

    Android相機(jī)啟動(dòng)加速詳解

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

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

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

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

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

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

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

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

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

    Android支付寶支付封裝代碼

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

最新評(píng)論

平乡县| 宜君县| 含山县| 临邑县| 内江市| 平阳县| 调兵山市| 阜阳市| 昭觉县| 报价| 若尔盖县| 东乡| 南丹县| 莱芜市| 巴楚县| 新田县| 双鸭山市| 旬阳县| 长沙县| 卢龙县| 招远市| 贵阳市| 重庆市| 武鸣县| 大理市| 房产| 丁青县| 蕉岭县| 濮阳县| 大余县| 吉林省| 察隅县| 进贤县| 临城县| 定州市| 石阡县| 贡觉县| 武城县| 娄烦县| 麦盖提县| 眉山市|