搭建中間凸起的Tab菜單結構

今年的雙11又再一次刷新了記錄,大家剁手做貢獻了嗎
回到今天的主題,很多app底下的Tab菜單結構為了突出,中間的tab比兩邊的高。


思路

  • 使用FragmentTabHost搭建Tab菜單
  • 使用一張圖片放在Tab中間

實現

1.使用FragmentTabHost搭建Tab菜單布局

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.test.tab.MainActivity">

    <android.support.v4.app.FragmentTabHost
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@android:id/tabhost"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:layout_weight="0"/>

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

            <TextView
                android:layout_width="match_parent"
                android:layout_height="0.8dp"
                android:background="#c8c8c8"/>

            <TabWidget
                android:id="@android:id/tabs"
                android:orientation="horizontal"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:divider="#00000000"
                android:layout_weight="0"/>

        </LinearLayout>
    </android.support.v4.app.FragmentTabHost>
    <!--中間的tab-->
    <ImageView
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:src="@mipmap/add"
        android:layout_marginBottom="20dp"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"/>

</RelativeLayout>
2.編寫每個tab的布局
<?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="match_parent"
              android:gravity="center"
              android:background="#ffffff"
              android:orientation="vertical"
    >

    <ImageView
        android:id="@+id/iv"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:src="@mipmap/ic_launcher"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Tab"
        android:textColor="@color/tab_text"
        android:textSize="12sp"/>

</LinearLayout>
3.為每個tab實現點擊選中的狀態

tab_text.xml
tab文字在選中和未選中的顏色選擇

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true" android:color="#0AA284"/>
    <item android:state_selected="false" android:color="#747474"/>
</selector>

tab_xxx.xml
每個tab在選中和未選中的圖標

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@mipmap/xxx" android:state_selected="true"></item>
    <item android:drawable="@mipmap/xxx"></item>
</selector>
4.實現FragmentTabHost
package com.test.tab;

import android.support.v4.app.FragmentTabHost;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity
{

    private FragmentTabHost mTabHost;
    int[] img = new int[]
            {R.drawable.tab_article, R.drawable.tab_topic, R.mipmap.white, R.drawable.tab_mag, R.drawable.tab_site};

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
        mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);

         /**setIndicator:設置tab的樣式
         *TabFragment.class:點擊tab展現的片段
         *getBundle(0):傳入展現片段的bundle
        */
 mTabHost.addTab(mTabHost.newTabSpec("home").setIndicator(getIndicatorView(0)),
                TabFragment.class, getBundle(0));
        mTabHost.addTab(mTabHost.newTabSpec("find").setIndicator(getIndicatorView(1)),
                TabFragment.class, getBundle(1));
        mTabHost.addTab(mTabHost.newTabSpec("add").setIndicator(getIndicatorView(2)),
                TabFragment.class, getBundle(2));
        mTabHost.addTab(mTabHost.newTabSpec("news").setIndicator(getIndicatorView(3)),
                TabFragment.class, getBundle(3));
        mTabHost.addTab(mTabHost.newTabSpec("mine").setIndicator(getIndicatorView(4)),
                TabFragment.class, getBundle(4));
    }

    public View getIndicatorView(int i)
    {
        View view = getLayoutInflater().inflate(R.layout.layout_indicator_view, null);
        ImageView mImageView = (ImageView) view.findViewById(R.id.iv);
        mImageView.setImageResource(img[i]);
        return view;
    }

    public Bundle getBundle(int type)
    {
        Bundle bundle = new Bundle();
        bundle.putInt("type", type);
        return bundle;
    }
}

原本中間的tab用白色的圖片資源代替

運行效果:

已經完成了,但是點著點著發現一個問題,中間突出的tab,超過分割線上方的區域點擊無效果

方法:給圖片設置一個點擊事件

 ImageView tab_add = (ImageView) findViewById(R.id.tab_add);
        tab_add.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                //設置tab當前頁面
                mTabHost.setCurrentTab(2);
            }
        });

Demo

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,117評論 25 708
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,202評論 4 61
  • L小姐剛結束和先生的通話,本來是正常愉悅的晚安電話,卻不想一句話讓正撒嬌的L小姐壞了心情。 其實事情不復雜,只是先...
    吃貨之荔閱讀 449評論 0 0
  • 記得那是04年。 小學的信息科技課上,那時學校的電腦用的還是windows98的系統,書上的教學內容,除卻開機、關...
    Reimu閱讀 313評論 0 1
  • 前言: @property關鍵字對每一個iOS開發者而言都不是陌生的,或許很多同行會說哥們現在都swift了你再談...
    藍色達風閱讀 597評論 0 4