Activity+Fragment选项卡整理

努力不一定有成果,但是不努力,就一定没有成果。

昨天太多不该,好好把握现在!

由于目前项目切换的太快,经常是上一个项目还没做完,下一个项目就已经启动了,又要重头开始搭界面了。然后一些常用的东西又要去之前的项目里面查找、copy,项目多了,有时候甚至忘了是哪个项目里面。在梁神的指点下,开启了博客之旅~,一方面整理一些自己所了解的知识点,另一方面,也是希望各路大神能够多多指点,这样对于我也是一个学习的机会。
本次就先从app的主界面开始写起,整理一下选项卡的实现。

在这里,我是把主界面的Fragment切换操作,单独的用作一个类BaseMenuActivity来进行操作,主界面的布局文件也是在BaseMenuActivity里面添加的,MainActivity里面只需要继承BaseMenuActivity实现其抽象方法就可以添加对应的数据了。

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

}

布局文件activity_main 里面,我还是习惯性的使用LinearLayout+TextView 来作为选项卡布局,这样方便对于菜单显示的调整。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:id="@+id/ll_bottom_menu"
        android:layout_width="match_parent"
        android:layout_height="49dp"
        android:layout_alignParentBottom="true"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/tv_menu_1"
            style="@style/style_menu_item_text"
            android:drawableTop="@drawable/img_home_sel"
            android:text="@string/str_menu_1" />

        <TextView
            android:id="@+id/tv_menu_2"
            style="@style/style_menu_item_text"
            android:drawableTop="@drawable/img_order_def"
            android:text="@string/str_menu_2" />

        <TextView
            android:id="@+id/tv_menu_3"
            style="@style/style_menu_item_text"
            android:drawableTop="@drawable/img_cart_def"
            android:text="@string/str_menu_3" />

        <TextView
            android:id="@+id/tv_menu_4"
            style="@style/style_menu_item_text"
            android:drawableTop="@drawable/img_user_def"
            android:text="@string/str_menu_4" />

    </LinearLayout>

    <FrameLayout
        android:id="@+id/fl_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/ll_bottom_menu" />

</RelativeLayout>

布局文件有了,然后我们就是实现菜单以及Fragment切换了。

这里我只是模拟了底部菜单的个数、名称,至于图标,Fragment ,需要通过BaseMenuActivity里面的抽象方法来进行添加。

/**
 * 菜单选中图片id
 */
public abstract int[] getSelDrawableIds();

/**
 * 菜单项默认图片id
 */
public abstract int[] getDefDrawableIds();

/**
 * 初始化的Fragment
 */
public abstract Fragment[] getFragments();

当我们在使用BaseMenuActivity的时候,只需要实现它的几个抽象方法添加相应的数据,

至于其他代码,就是一些对Fragment切换,TextView显示样式和图标的处理,所有代码我就直接贴出来了,

BaseMenuActivity

package com.example.lvfq.testapp;

import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.widget.TextView;

/**
 * --------------------------------------------
 * auther :  Lvfq
 * 2016/6/18 1:29
 * description  * <p/>
 * -------------------------------------------
 **/
public abstract class BaseMenuActivity extends BaseActivity implements View.OnClickListener {

    /**
     * 菜单选中图片id
     */
    public abstract int[] getSelDrawablIds();

    /**
     * 菜单项默认图片id
     */
    public abstract int[] getDefDrawablIds();

    /**
     * 初始化的Fragment
     */
    public abstract Fragment[] getFragments();

    /**
     * 当前选中的菜单项下标
     */
    public abstract void curSelMenuPos(int position);

    public abstract void init();


    private TextView[] tvs;
    private int[] selDrawIds, defDrawIds;
    private Fragment[] fragments;

    FragmentManager manager;
    private int curIndex;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
	init();
}

    public void initView() {
        tvs = new TextView[4];
        tvs[0] = find(R.id.tv_menu_1);
        tvs[1] = find(R.id.tv_menu_2);
        tvs[2] = find(R.id.tv_menu_3);
        tvs[3] = find(R.id.tv_menu_4);

        selDrawIds = getSelDrawablIds();
        defDrawIds = getDefDrawablIds();
        fragments = getFragments();

        if (!(selDrawIds.length == tvs.length && defDrawIds.length == tvs.length && fragments.length == tvs.length)) {
            throw new RuntimeException("init data exception , please check .");
        }

        for (int i = 0; i < tvs.length; i++) {
            TextView tv = tvs[i];
            setTvDraw(tv, defDrawIds[i]);
            tv.setOnClickListener(this);
        }
        manager = getSupportFragmentManager();
        FragmentTransaction t = manager.beginTransaction();
        for (Fragment fragment : fragments) {
            t.add(R.id.fl_main, fragment).hide(fragment);
        }
        t.show(fragments[0]);
        t.commit();
        tvs[0].setSelected(true);
        setTvDraw(tvs[0], selDrawIds[0]);
    }

    @Override
    public void onClick(View v) {
//        for (int i = 0; i < tvs.length; i++) {
//            TextView tv = tvs[i];
//            int drawId;
//            boolean isSel;
//            if (v.getId() == tv.getId()) {
//                isSel = true;
//                drawId = selDrawIds[i];
//                curSelMenuPos(i);
//            } else {
//                isSel = false;
//                drawId = defDrawIds[i];
//            }
//            tv.setSelected(isSel);
//            operationFragment(fragments[i], isSel);
//            setTvDraw(tv, drawId);
//        }
        int index = 0;
        switch (v.getId()) {
            case R.id.tv_menu_1:
                index = 0;
                break;
            case R.id.tv_menu_2:
                index = 1;
                break;
            case R.id.tv_menu_3:
                index = 2;
                break;
            case R.id.tv_menu_4:
                index = 3;
                break;
        }
        if (curIndex != index) {
            tvs[index].setSelected(true);
            setTvDraw(tvs[index], selDrawIds[index]);
            setTvDraw(tvs[curIndex], defDrawIds[curIndex]);
            tvs[curIndex].setSelected(false);
            operationFragment(fragments[curIndex], false);
            operationFragment(fragments[index], true);
            curIndex = index;
        }
    }

    public void operationFragment(Fragment fragment, boolean isShow) {
        FragmentTransaction tf = manager.beginTransaction();
        if (isShow) {
            tf.show(fragment);
        } else {
            tf.hide(fragment);
        }
        tf.commit();
    }

    /**
     * 设置TextView的显示图片
     *
     * @param tv
     * @param drawId
     */
    public void setTvDraw(TextView tv, int drawId) {
        Drawable draw = getResources().getDrawable(drawId);
        tv.setCompoundDrawablesWithIntrinsicBounds(null, draw, null, null);
    }
}

find方法:

public <T extends View> T find(int id) {
    return (T) findViewById(id);
}

MainActivity实现:

public class MainActivity extends BaseMenuActivity {


    TestFragment1 testFragment = new TestFragment1();
    TestFragment2 testFragment2 = new TestFragment2();
    TestFragment3 testFragment3 = new TestFragment3();
    TestFragment4 testFragment4 = new TestFragment4();

    @Override
    public int[] getSelDrawablIds() {
        return new int[]{R.drawable.img_home_sel,
                R.drawable.img_order_sel, R.drawable.img_cart_sel, R.drawable.img_user_sel};
    }

    @Override
    public int[] getDefDrawablIds() {
        return new int[]{R.drawable.img_home_def,
                R.drawable.img_order_def, R.drawable.img_cart_def, R.drawable.img_user_def};
    }

    @Override
    public Fragment[] getFragments() {
        return new Fragment[]{testFragment, testFragment2, testFragment3, testFragment4};
    }


    @Override
    public void curSelMenuPos(int position) {
    }

    @Override
    public void init() {
    }
}

运行效果图


另外需要说明一点的是,通过xml设置状态的时候,一定要把默认的放在最下面,不然会没效果。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/c_menu_bg_sel" android:state_selected="true" />
    <item android:drawable="@color/c_menu_bg_def" />
</selector>

使用的时候如果有需要自己的BaseActivity,可以通过BaseMenuActivity继承BaseActivity。


欢迎各位大神前来指点~


demo下载

http://download.youkuaiyun.com/download/lv_fq/9553633



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值