概述
2016年的全新开始中,很荣幸接受Android项目的重构,对于我这种菜鸟,这是一个提升认识的绝佳机会。2月17日立项开始,现在的有效编码时间已经超过了十天,已经初见雏形,同时,也即将面对未来数不清的Bug大军。有一点加班后的疲惫,也有对于未来的更多挑战的兴奋。闲话少叙~
借助思维导图,理解一切大体情况是我一直来的风格。
一、准备工具集
工具集中主要包含:日志,网络检查,加载进度条展示,Toast工具,崩溃日志及全局异常捕获。最后一个是一个大项,在之后的强化中,还需要有更多的拓展、完善。
日志注意点:分级打印,不同的情形打印不同的信息;还需要有debug/release分离,或者采用变量控制---在最终发布版上将所有日志关闭,而在其他的条件下,日志打印 需要放开,利于程序人员调试与查找问题。
网络检查注意点:现在的应用程序都带有网络请求,这个工具使用频率高,其应用位置关键,需要不留隐患。
加载进度条:其实现方式有很多种,在移动应用中,更合理些的是占屏模式,即是在加载过程中,屏蔽其他操作;在公司需求中,这个加载进度需要有自己的风格,则应该支持整体布局的调整。
Toast工具则主要考虑现实的时长及现实的位置,提醒置于中间部分效果会比较好。
下拉刷新,上拉加载更多作为一个使用频率很高的公共控件,可以将其单独提出,形成一个特色控件。
在页面框架中,根据购物类App的特色,选择了ButtonGroup+Fragment的方式。
将工具集封装放入一个部分,在之后,就可以用来使用,所以,这里是一个纯净版本框架,同时,要是大家在使用中,遇见新的bug及不好用,有更好的方式的时候,记得共享。我一直在等你的优化消息~~
二、页面框架
如上所述,页面框架选择了ButtonGroup+Fragment的构建方式。
1,创建项目,先实现整体布局的xml文件
其中,button的模式是重复的,我们可以采用style的方式封装;每一个按钮都存在有点击/未点击的状态,用selector实现。
activity.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<FrameLayout
android:id="@+id/main_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="50dp"/>
<RadioGroup
android:id="@+id/main_bottom_menu_rg"
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="horizontal"
android:layout_alignParentBottom="true"
android:background="@color/home_bar_classbg_select">
<RadioButton
android:id="@+id/main_bottom_rb_home"
style="@style/main_bottom_radiobutton_style"
android:drawableTop="@drawable/main_bottom_rb_home_selector"
android:button="@null" />
<RadioButton
android:id="@+id/main_bottom_rb_class"
style="@style/main_bottom_radiobutton_style"
android:drawableTop="@drawable/main_bottom_rb_class_selector"
android:button="@null"/>
<RadioButton
android:id="@+id/main_bottom_rb_search"
style="@style/main_bottom_radiobutton_style"
android:drawableTop="@drawable/bar_bottom_rb_search_selector"
android:button="@null"/>
<RadioButton
android:id="@+id/main_bottom_rb_shopping"
style="@style/main_bottom_radiobutton_style"
android:drawableTop="@drawable/bar_bottom_rb_shopping_selector"
android:button="@null"/>
<RadioButton
android:id="@+id/main_bottom_rb_mycenter"
style="@style/main_bottom_radiobutton_style"
android:drawableTop="@drawable/bar_bottom_rb_mycenter_selector"
android:button="@null"/>
</RadioGroup>
</RelativeLayout>
2,选用Fragment,创建五个Fragment:作为5Button的对应主题
注:v4 包下,app下Fragment两。
app下Fragment使用,MainActivity继承Activity,在使用FragmentManager 即用getFragmentManager()获取对象,再用manager.beginTransaction();得到FragmentTransaction对象。
用V4包下Fragment,则在Activity上时,继承FragmentActivity;用getSupportFragmentManager获取FragmentManager 对象。
3,隐藏已经显示的Fragment,使用FragmentTransaction对象的hide()方法,将所有已经展示出来的隐藏掉;再将现在该展示的展示出来,使用FragmentTransaction对象的add()方法。
4,重写对返回键的监听
public class MainActivity extends FragmentActivity implements RadioGroup.OnCheckedChangeListener {
private HomeFragment mHomefragment;
private ClassifyFragment mClassifyFragment;
private EventFragment mEventFragment;
private ShoppingFragment mShoppingFragment;
private MycenterFragment mMycenterFragment;
private RadioButton mHomeRb;
private int mPage = 0;
private long exitTime = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
/**
* 初始化所有View
*/
private void initView() {
GloableParams.CONTEXT = this;
mHomeRb = (RadioButton) findViewById(R.id.main_bottom_rb_home);
mHomeRb.setChecked(true);
RadioGroup mMainBG = (RadioGroup) findViewById(R.id.main_bottom_menu_rg);
mMainBG.setOnCheckedChangeListener(this);
selectFragment(0);
}
/**
* 设置ButtonGroup中被选中的项
*
* @param index
*/
private void selectFragment(int index) {
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
hideFragment(transaction);
switch (index) {
case 0:
mPage = 0;
if (mHomefragment == null) {
mHomefragment = new HomeFragment();
transaction.add(R.id.main_fragment, mHomefragment);
} else {
transaction.add(R.id.main_fragment, mHomefragment);
}
break;
case 1:
if (mClassifyFragment == null) {
mClassifyFragment = new ClassifyFragment();
transaction.add(R.id.main_fragment, mClassifyFragment);
} else {
transaction.add(R.id.main_fragment, mClassifyFragment);
}
break;
case 2:
if (mEventFragment == null) {
mEventFragment = new EventFragment();
transaction.add(R.id.main_fragment, mEventFragment);
} else {
transaction.add(R.id.main_fragment, mEventFragment);
}
break;
case 3:
if (mShoppingFragment == null) {
mShoppingFragment = new ShoppingFragment();
transaction.add(R.id.main_fragment, mShoppingFragment);
} else {
transaction.add(R.id.main_fragment, mShoppingFragment);
}
break;
case 4:
if (mMycenterFragment == null) {
mMycenterFragment = new MycenterFragment();
transaction.add(R.id.main_fragment, mMycenterFragment);
} else {
transaction.add(R.id.main_fragment, mMycenterFragment);
}
break;
}
}
/**
* 将未被选中的Fragment置为隐藏
*
* @param transaction
*/
private void hideFragment(FragmentTransaction transaction) {
if (mHomefragment != null) {
transaction.hide(mHomefragment);
}
if (mClassifyFragment != null) {
transaction.hide(mClassifyFragment);
}
if (mEventFragment != null) {
transaction.hide(mEventFragment);
}
if (mShoppingFragment != null) {
transaction.hide(mShoppingFragment);
}
if (mMycenterFragment != null) {
transaction.hide(mMycenterFragment);
}
}
/**
* ButtonGroup点击切换事件
*
* @param group
* @param checkedId
*/
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.main_bottom_rb_home:
selectFragment(0);
break;
case R.id.main_bottom_rb_class:
selectFragment(1);
break;
case R.id.main_bottom_rb_search:
selectFragment(2);
break;
case R.id.main_bottom_rb_shopping:
selectFragment(3);
break;
case R.id.main_bottom_rb_mycenter:
selectFragment(4);
break;
}
}
/**
* 返回键监听
*/
@Override
public void onBackPressed() {
switch (mPage) {
case 0:
case 4:
exit();
break;
case 1:
case 2:
case 3:
selectFragment(0);
mHomeRb.setChecked(true);
break;
}
super.onBackPressed();
}
public void exit() {
if ((System.currentTimeMillis() - exitTime) > 2 * 1000) {
Toast.makeText(getApplicationContext(), "再点一次返回退出程序", Toast.LENGTH_LONG).show();
exitTime = System.currentTimeMillis();
} else {
finish();
System.exit(0);//系统推出,马上执行
}
}
}
App页面框架中有介绍及简单的实现页面框架,对于一个事物的认识,还是次数越多,了解越清晰。
三、总结
长路漫漫,明天会进入全新的debug路程,挑战与机会并存。
人生路途上还有很远要走,我知道,心朝阳光,就不会有阴影~
若你看到这篇文章,请你帮助我们一起成长~~
电脑前的你,给自己一个拥抱,美好的一天才刚刚开启~~
你想要的源码~_~
最后
以上就是美好路人为你收集整理的Android 项目框架构建的全部内容,希望文章能够帮你解决Android 项目框架构建所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复