cathome 猫家 开发日记-底部导航

概述:一个linearlayout,根据数组动态插入textview. 并给textview添加click事件,同时记录点击的textview在数据中,所处的索引位置。

1.item.setSelected(false); 可以实现那个被点击了
2.使用委托把点击事件延迟到外部定义。

底部导航封装为自定义控件。

算是比较方便了。

package com.utils.widgets;

import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class LSUIBottomNavigation extends LinearLayout implements View.OnClickListener
{
    List<MenuItem> mMenus=new ArrayList<>();
    List<TextView> mTextViews=new ArrayList<>();
    int mSelectIndex=0;
    IBottomNavigation handle;
    int mNormalID;
    int mSelectColorid;

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

    public LSUIBottomNavigation(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        this.setOrientation(HORIZONTAL);
    }

    public void SetupControls(List<MenuItem> data,IBottomNavigation handlea,int normalid,int selectid,int selectIndex)
    {
        if(data==null)
        {
            return;
        }
        handle=handlea;
        mMenus=data;
        mNormalID=normalid;
        mSelectColorid=selectid;
        mSelectIndex=selectIndex;
        for(int i=0;i<mMenus.size();i++)
        {
            TextView tempTV=new TextView(this.getContext());
            tempTV.setText(mMenus.get(i).RID);
            tempTV.setTag(i);
            tempTV.setOnClickListener(this);

            Drawable drawable = mMenus.get(i).topPic;
            drawable.setBounds(0,0,drawable.getMinimumWidth(),drawable.getMinimumHeight());
            tempTV.setCompoundDrawables(null, drawable, null, null);

            SetStyle(tempTV);
            mTextViews.add(tempTV);
            this.addView(tempTV);
        }
        FlushMenu();
    }

    private void SetStyle(TextView tempTV)
    {
        LinearLayout.LayoutParams lyp=new LinearLayout.LayoutParams(100, ViewGroup.LayoutParams.MATCH_PARENT);
        lyp.weight=1;
        tempTV.setLayoutParams(lyp);
        tempTV.setGravity(Gravity.CENTER);
        tempTV.setTextColor(createColorStateList(getResources().getColor(mNormalID), getResources().getColor(mSelectColorid)));
    }

    /** 对TextView设置不同状态时其文字颜色。 */
    private ColorStateList createColorStateList(int normal, int pressed) {
        int[] colors = new int[] { pressed, normal };
        int[][] states = new int[2][];
        states[0] = new int[] {android.R.attr.state_selected };
        states[1] = new int[] {};
        ColorStateList colorList = new ColorStateList(states, colors);
        return colorList;
    }

    @Override
    public void onClick(View v)
    {
        if(v instanceof TextView)
        {
            TextView tv=(TextView)v;
            mSelectIndex=(int)tv.getTag();
            if(handle!=null)
            {
                handle.OnClickMenu(v);
            }
        }
        FlushMenu();
    }

    private void FlushMenu()
    {
        for(TextView item : mTextViews)
        {
            item.setSelected(false);
        }
        if(mTextViews.size()>mSelectIndex)
        {
            mTextViews.get(mSelectIndex).setSelected(true);
        }
    }

    public static class MenuItem
    {
        public int RID;
        //public String title;
        public Drawable topPic;
    }

    public interface IBottomNavigation
    {
        public void OnClickMenu(View v);
    }
}

使用:

1.view文件

<com.utils.widgets.LSUIBottomNavigation android:orientation="horizontal" android:id="@+id/bottomMenu" android:layout_width="match_parent" android:layout_height="56dp" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:paddingLeft="1dp" android:paddingRight="1dp"></com.utils.widgets.LSUIBottomNavigation>

2.activity:

List<LSUIBottomNavigation.MenuItem> aa=new ArrayList<>();

 mMenu.SetupControls(aa,this,R.color.color_grey,R.color.color_green,0);

3.可以在单个页面使用多个控件,互相不影响。也可以在不同的页面使用一个,好像是页面没 变一样。因为

使用了内部变量 int mSelectIndex=0;,而且初始化控件提供了函数参数来赋值。最开始是打算用静态变量的。
public void SetupControls(List<MenuItem> data,IBottomNavigation handlea,int normalid,int selectid,int selectIndex)

 一般采用fragment来展示不同页面。这里采用了继承的activity来展示不同页面。

基类:

package com.android.linson.catshome.Control;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.View;
import android.widget.RelativeLayout;
import com.android.linson.catshome.Control.Category.CategoryIndex;
import com.android.linson.catshome.Control.wike.WikeIndex;
import com.android.linson.catshome.R;
import com.utils.widgets.LSUIBottomNavigation;

import java.util.ArrayList;
import java.util.List;

//1.实现整体布局,留出主页面给派生类填充 。
//2.实现底部菜单功能 。
public abstract class MasterPage extends Activity implements LSUIBottomNavigation.IBottomNavigation
{
    //control
    protected RelativeLayout mContent;
    protected com.utils.widgets.LSUIBottomNavigation mMenu;

    //data
    protected String TAG="DEBUG";
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.masterpage);
        FindControls();
        SetupMenu();
        mContent.addView(GetContent());
    }

    protected void SetupMenu()
    {
        LSUIBottomNavigation.MenuItem temp1=new LSUIBottomNavigation.MenuItem();
        temp1.RID=R.string.bottomMenu1;
        temp1.topPic=getResources().getDrawable(R.drawable.category );
        LSUIBottomNavigation.MenuItem temp2=new LSUIBottomNavigation.MenuItem();
        temp2.RID=R.string.bottomMenu2;
        temp2.topPic=getResources().getDrawable(R.drawable.book );
        LSUIBottomNavigation.MenuItem temp3=new LSUIBottomNavigation.MenuItem();
        temp3.RID=R.string.bottomMenu3;
        temp3.topPic=getResources().getDrawable(R.drawable.book );
        LSUIBottomNavigation.MenuItem temp4=new LSUIBottomNavigation.MenuItem();
        temp4.RID=R.string.bottomMenu4;
        temp4.topPic=getResources().getDrawable(R.drawable.book );
        LSUIBottomNavigation.MenuItem temp5=new LSUIBottomNavigation.MenuItem();
        temp5.RID=R.string.bottomMenu5;
        temp5.topPic=getResources().getDrawable(R.drawable.book );

        List<LSUIBottomNavigation.MenuItem> aa=new ArrayList<>();
        aa.add(temp1);
        aa.add(temp2);
        aa.add(temp3);
        aa.add(temp4);
        aa.add(temp5);

        mMenu.SetupControls(aa,this,R.color.color_grey,R.color.color_green,GetSelectIndex());
    }

    public abstract View GetContent();
    public abstract int GetSelectIndex();

    private void FindControls()
    {
        mContent=findViewById(R.id.RLayoutContent);
        mMenu=findViewById(R.id.bottomMenu);
    }

    @Override
    public void OnClickMenu(View v)
    {
        Log.i(TAG, "OnClickMenu: "+v.getTag());
        switch ((int)v.getTag())
        {
            case 0:
            {
                Intent page=new Intent(this, CategoryIndex.class);
                page.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(page);
                break;
            }
            case 1:
            {
                Intent page=new Intent(this, WikeIndex.class);
                page.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(page);
                break;
            }
        }
    }
}

有一个立即的好处。 导航的弹出。到基类页面写就好了。

可以复用一些代码。

protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

原文地址:https://www.cnblogs.com/lsfv/p/9822562.html