Android 项目框架构建

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路程,挑战与机会并存。

人生路途上还有很远要走,我知道,心朝阳光,就不会有阴影~

若你看到这篇文章,请你帮助我们一起成长~~


电脑前的你,给自己一个拥抱,美好的一天才刚刚开启~~

你想要的源码~_~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

壹叁零壹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值