努力不一定有成果,但是不努力,就一定没有成果。
昨天太多不该,好好把握现在!
由于目前项目切换的太快,经常是上一个项目还没做完,下一个项目就已经启动了,又要重头开始搭界面了。然后一些常用的东西又要去之前的项目里面查找、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