纯代码实现button+fragment底部菜单栏

首先说说为什么要用纯代码。

纯代码布局的适用性强,对于一些打包,混淆加密,资源管理等具备一定的优势。而且代码动态布局使用起来感觉让人更便利,一次封装就能随心所欲的控制。

但同时纯代码布局也会有很多弊端,比如界面无法用IDE及时实现可视化,调试困难,没有阅读纯代码习惯的话会造成一定的困扰,对新手来讲更是觉得有些难以阅读,如果项目架构不明确的话更是让人难以维护。

现在的纯代码布局多数用于一些SDK插件之中,打包的便利性会让SDK集成变得相当容易,抛弃了res文件的copy,开发也不用去利用Java有些跳跃的反射机制去读取资源ID,这样,集成起来可能只需要一个jar就可以了,然后配置主文件,调用接口即可。

好了,言归正传,开始说说纯代码实现的这个例子。

首先看下act的内容,相当简单。


package com.example.test;

import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;

import com.example.test.fragment.AFragment;
import com.example.test.fragment.BFragment;
import com.example.test.fragment.CFragment;
import com.example.test.fragment.DFragment;
import com.example.test.frame.MainView;
import com.example.test.frame.MenuInfo;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ArrayList<MenuInfo> infos = new ArrayList<MenuInfo>();
        infos.add(new MenuInfo(0, R.drawable.b, R.drawable.a, "首页",new AFragment()));
        infos.add(new MenuInfo(1, R.drawable.b, R.drawable.a, "云播",new BFragment()));
        infos.add(new MenuInfo(2, R.drawable.b, R.drawable.a, "博客",new CFragment()));
        infos.add(new MenuInfo(3, R.drawable.b, R.drawable.a, "我",new DFragment()));
        MainView mv = new MainView(this,infos,0);
        setContentView(mv);
    }          
}


看上去是不是很简单? 代码里有用到MainView跟MenuInfo这两个类,我们先上MenuInfo的代码:

package com.example.test.frame;

import android.app.Fragment;

public class MenuInfo {
	
	public int id;
	public int downImg;
	public int upImg;
	public String text;
	public Fragment f;
	
	public MenuInfo(int id, int downImg, int upImg, String text,Fragment f) {
		super();
		this.id = id;
		this.downImg = downImg;
		this.upImg = upImg;
		this.text = text;
		this.f = f;
	}
}


可以看到这实际上是一个实体类,里面封装了我们需要的一些信息,id,按下去的图片,弹起的图片,标题文本,还有fragment。act中用到的就是这个了,我们把这个实体放到一个ArrayList中,然后再根据MainView去动态的创建我们需要的视图,底部需要几个按钮就创建几个实体。那我们看看这个神奇的MainView究竟怎么实现的。

package com.example.test.frame;

import java.util.ArrayList;

import android.app.Activity;
import android.app.FragmentTransaction;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MainView extends LinearLayout implements OnClickListener {

	private Activity mActivity;
	private ArrayList<MenuInfo> infos;
	private ImageView iv;
	private TextView tv;
	private int oldId;
	private FrameLayout flayout;
	
	private int textUp = 0xffffffff;
	private int textDown = 0xff3e3e3e;
	
	public MainView(Activity act, ArrayList<MenuInfo> infos, int id) {
		super(act);
		this.mActivity = act;
		this.infos = infos;
		this.setOrientation(LinearLayout.VERTICAL);
		this.oldId = infos.get(0).id;
		init();
		initItem();
		defClick(id);
	}

	private void init() {
		flayout = new FrameLayout(mActivity);
		flayout.setId(0x9527);
		LinearLayout.LayoutParams llp = new LayoutParams(-1, -2);
		llp.weight = 1;
		this.addView(flayout, llp);
	}

	private void initItem() {
		LinearLayout bottomLayout = new LinearLayout(mActivity);
		bottomLayout.setOrientation(LinearLayout.HORIZONTAL);
		bottomLayout.setGravity(Gravity.CENTER);
		bottomLayout.setBackgroundColor(0xffeeeeee);
		this.addView(bottomLayout);

		LayoutParams lp = new LayoutParams(-1, -1);
		lp.weight = 1;

		LayoutParams llp = new LayoutParams(-2, -2);
		llp.gravity = Gravity.CENTER;

		for (MenuInfo mMenuInfo : infos) {

			LinearLayout item = new LinearLayout(mActivity);
			item.setOrientation(LinearLayout.VERTICAL);
			item.setId(mMenuInfo.id);
			item.setTag(mMenuInfo);
			item.setOnClickListener(this);
			bottomLayout.addView(item, lp);

			iv = new ImageView(mActivity);
			iv.setBackgroundResource(mMenuInfo.downImg);
			item.addView(iv, llp);

			tv = new TextView(mActivity);
			tv.setText(mMenuInfo.text);
			tv.setTextSize(13);
			tv.setTextColor(textDown);
			item.addView(tv, llp);
		}
	}

	private void setClickAt(int nowId) {
		downClick(oldId);
		upClick(nowId);
		this.oldId = nowId;
	}

	private void defClick(int id) {
		setClickAt(id);
		MenuInfo mMenuInfo = (MenuInfo) this.findViewById(id).getTag();
		mActivity.getFragmentManager().beginTransaction()
				.add(0x9527, mMenuInfo.f, mMenuInfo.id + "").commit();
	}

	private void downClick(int id) {
		LinearLayout ll = (LinearLayout) this.findViewById(id);
		MenuInfo mMenuInfo = (MenuInfo) ll.getTag();
		ImageView iv = (ImageView) ll.getChildAt(0);
		iv.setBackgroundResource(mMenuInfo.downImg);
		TextView tv = (TextView) ll.getChildAt(1);
		tv.setTextColor(textUp);
	}

	private void upClick(int id) {
		LinearLayout ll = (LinearLayout) this.findViewById(id);
		MenuInfo mMenuInfo = (MenuInfo) ll.getTag();
		ImageView iv = (ImageView) ll.getChildAt(0);
		iv.setBackgroundResource(mMenuInfo.upImg);
		TextView tv = (TextView) ll.getChildAt(1);
		tv.setTextColor(textDown);
	}

	@Override
	public void onClick(View v) {
		int id = v.getId();
		setClickAt(id);
		MenuInfo mMenuInfo = (MenuInfo) this.findViewById(id).getTag();
		FragmentTransaction transaction = mActivity.getFragmentManager().beginTransaction();
		transaction.replace(0x9527, mMenuInfo.f);
//		Toast.makeText(mActivity, mActivity.getFragmentManager().getBackStackEntryCount()+"", 0).show();
//		transaction.addToBackStack(null);
		transaction.commit();
	}
}

好了,没错,看上去就这么多。省去了所有的配置文件,主要的代码就这样完成了。我们看下效果图。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值