纯代码实现button+fragment底部菜单栏
2016-06-23 12:26
316 查看
首先说说为什么要用纯代码。
纯代码布局的适用性强,对于一些打包,混淆加密,资源管理等具备一定的优势。而且代码动态布局使用起来感觉让人更便利,一次封装就能随心所欲的控制。
但同时纯代码布局也会有很多弊端,比如界面无法用IDE及时实现可视化,调试困难,没有阅读纯代码习惯的话会造成一定的困扰,对新手来讲更是觉得有些难以阅读,如果项目架构不明确的话更是让人难以维护。
现在的纯代码布局多数用于一些SDK插件之中,打包的便利性会让SDK集成变得相当容易,抛弃了res文件的copy,开发也不用去利用Java有些跳跃的反射机制去读取资源ID,这样,集成起来可能只需要一个jar就可以了,然后配置主文件,调用接口即可。
好了,言归正传,开始说说纯代码实现的这个例子。
首先看下act的内容,相当简单。
看上去是不是很简单? 代码里有用到MainView跟MenuInfo这两个类,我们先上MenuInfo的代码:
可以看到这实际上是一个实体类,里面封装了我们需要的一些信息,id,按下去的图片,弹起的图片,标题文本,还有fragment。act中用到的就是这个了,我们把这个实体放到一个ArrayList中,然后再根据MainView去动态的创建我们需要的视图,底部需要几个按钮就创建几个实体。那我们看看这个神奇的MainView究竟怎么实现的。
好了,没错,看上去就这么多。省去了所有的配置文件,主要的代码就这样完成了。我们看下效果图。
纯代码布局的适用性强,对于一些打包,混淆加密,资源管理等具备一定的优势。而且代码动态布局使用起来感觉让人更便利,一次封装就能随心所欲的控制。
但同时纯代码布局也会有很多弊端,比如界面无法用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(); } }
好了,没错,看上去就这么多。省去了所有的配置文件,主要的代码就这样完成了。我们看下效果图。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法