為 FragmentTabhost 新增 tab 點選事件,在頁面跳轉之前

Wing_Li發表於2018-11-30

如果本文幫助到你,本人不勝榮幸,如果浪費了你的時間,本人深感抱歉。 希望用最簡單的大白話來幫助那些像我一樣的人。如果有什麼錯誤,請一定指出,以免誤導大家、也誤導我。 本文來自:www.jianshu.com/u/320f9e8f7… 感謝您的關注。

利用 FragmentTabhost 來實現頁面的切換,是我們經常用到的功能。最近有這麼一個需求,底部的切換按鈕中的一個點選要跳轉到另一個APP,而不是跳轉到本APP頁面。 如下圖:

為 FragmentTabhost 新增 tab 點選事件,在頁面跳轉之前


調查了之後,發現 FragmentTabhost 只能 onTabChanged 切換,在切換之前並沒有提供相應的點選事件。 然後就去看了看原始碼,原始碼也是挺簡單的,隨即自己寫了一個類繼承 FragmentTabhost ,在 onTabChanged 執行操作之前,寫一個點選事件的監聽。 程式碼非常的簡單:

建立一個 FragmentTabHost 類:

public class FragmentTabHost extends android.support.v4.app.FragmentTabHost {

    private OnTabClickListener mOnTabClickListener = null;
    private boolean isClickLinstener = false;


    public FragmentTabHost(Context context) {
        super(context);
    }


    public FragmentTabHost(Context context, AttributeSet attrs) {
        super(context, attrs);
    }


    @Override
    public void onTabChanged(String tabId) {
        if (null != mOnTabClickListener) {
            isClickLinstener = mOnTabClickListener.onTabClick(tabId);
        }

        if (!isClickLinstener) {
            super.onTabChanged(tabId);
        }
    }


    public void setOnTabClickListener(OnTabClickListener mOnTabClickListener) {
        this.mOnTabClickListener = mOnTabClickListener;
    }


    public interface OnTabClickListener {
        /**
         * If you set the click event, according to the return value of the click event to determine whether to continue to perform
         *
         * @param tabId tabId
         * @return true:Interception event;false:Superclass continue
         */
        boolean onTabClick(String tabId);
    }
}
複製程式碼

然後,在是使用 FragmentTabHost 時,要用我們重寫的這個類。


不想自己重寫的話,可以引入一個 Gradle 庫:

dependencies {
    compile 'com.lyl.tabhost:tabhost:1.0.0'
}
複製程式碼

然後使用 com.lyl.tabhost.FragmentTabHost 即可。 Demo地址:github.com/Wing-Li/Fra…


注意: 在 activity_main.xml 中寫 FragmentTabHost 控制元件時,設定的資源id只能是 @android:id/tabhost 。 例:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:id="@+id/activity_main"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <FrameLayout
        android:id="@+id/main_content"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>

    <com.lyl.tabhost.FragmentTabHost
        android:id="@android:id/tabhost"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </com.lyl.tabhost.FragmentTabHost>
</LinearLayout>
複製程式碼

專案地址為: github.com/Wing-Li/Fra…

相關文章