Android App中使用全域性Toast

weixin_34320159發表於2016-05-17

自定義的FlexibleToast主要功能:

  1. 支援預設格式,自上向下佈局為ImageView、TextView、TextView,三個控制元件可以自由組合顯示或隱藏
  2. 支援Top,Center,Bottom的位置顯示,預設Bottom和TOAST_SHORT顯示。
  3. 可以傳入自定義的layout的View,支援其他自定義的顯示
  4. 共用一個Toast物件,防止多次Toast重疊以及並顯示時間的累加,該控制元件僅保留最後一次的文字、顯示時間等設定。
  5. 在app自己自定義的Application中建立的Toast,Activity,Fragment,Adapter中都可以直接呼叫。
  6. 主執行緒或者子執行緒可以直接呼叫。
  7. 使用簡單,先建立一個控制toast各種屬性的builder,然後直接呼叫toastShowByBuilder(builder)即可。

配置和使用步驟:

  1. 在自定義的單例Application中新增如下程式碼:
    public class BaseApp extends Application {
    //.....自己的其他程式碼,該BaseApp必是單例的
    // 全域性的 handler 物件
    private final Handler APPHANDLER = new Handler();
    // 全域性的 Toast 物件
    private FlexibleToast flexibleToast;
    // ........其他操作
    // 在初始化資源的地方建立Toast
    flexibleToast = new FlexibleToast(this);
    public void toastShowByBuilder(final FlexibleToast.Builder builder) {
    if (Looper.myLooper() != Looper.getMainLooper()) {
    getAppHandler().post(new Runnable() {
    @Override
    public void run() {
    flexibleToast.toastShow(builder);
    }
    });
    } else {
    flexibleToast.toastShow(builder);
    }
    }
    //.....others
    }
    現在就可以在想Toast的地方使用了。

  2. 使用方法:
    buidler中設定想要的樣式,包括顯示什麼元素,位置,時長。
    FlexibleToast.Builder builder = new FlexibleToast.Builder(this).setGravity(FlexibleToast.GRAVITY_TOP).setFirstText("first").setSecondText("second=" + System.currentTimeMillis());
    BaseApp.getApp().toastShowByBuilder(builder);
    如果想利用自己定義的佈局,可以這樣使用:
    其中R.layout.layout_toast_with_two_text是自己定義的佈局,此時builder中對ImageView和TextView的設定都是無效的了。
    View toastView = LayoutInflater.from(this).inflate(R.layout.layout_toast_with_two_text, null, false);
    TextView tvOne = (TextView) toastView.findViewById(R.id.tv_text_one);
    TextView tvTwo = (TextView) toastView.findViewById(R.id.tv_text_two);tvOne.setText("customer one");tvTwo.setText("customer two");
    FlexibleToast.Builder builder = new FlexibleToast.Builder(this).setCustomerView(toastView);BaseApp.getApp().toastShowByBuilder(builder);

  3. 關於初始化Toast的Context,原始碼中的doc是這樣寫的:

The context to use. Usually your {@link android.app.Application} or {@link android.app.Activity} object.

Demo中將new Toast放到了自己的Application中,這樣那麼子執行緒使用就能直接show,而子執行緒如果在使用的時候才new Toast,會Crash,要麼就要用handler去post到主執行緒中toast。也就是要保證toast的建立在主執行緒總。ToastDemo中的SensorList頁面中有這兩個例子。

  1. Demo地址:
    https://github.com/maoranbian/MTime

相關文章