Android项目实战:商城APPday01框架搭建

  • day01
  • 内容
  • 1. 启动页面
  • 2. 主页面
  • 3. 框架搭建
  • 盲区
  • 其他实战
  • 商城
  • 新闻



不否认努力,继续加油!

学习整理重点、盲区,笔记如下:干干巴巴,麻麻赖赖,一点都不圆润……
源码 已上传至集哈:ShoppingMall.
https://github.com/SmileAlfred/ShoppingMall

day01

内容

1. 启动页面

  1. 欢迎页面,延迟两秒后进入主程序:
protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_welcome);
     //两秒钟进入主页面
     new Handler().postDelayed(new Runnable() {
         @Override
         public void run() {
             //执行在主线程;启动主页面
             startActivity(new Intent(WelcomeActivity.this,MainActivity.class));
             //关闭当前页面
             finish();
         }
     },2000);
 }

2. 主页面

  1. 效果图如下:分析:总体为线性布局,下面是 RadioGroup,上面是 帧布局,替换不同的 FragmentLayout;
  2. android程序架构设计 android应用程序构建实战_安卓

  3. 布局文件:
<RadioGroup
    android:id="@+id/rg_main"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:background="@drawable/home_bottom_parent_bg"
    android:orientation="horizontal">
    <RadioButton
        android:id="@+id/rb_home"
        style="@style/MainButtonStyle"
        android:drawableTop="@drawable/home_button_selector"
        android:text="首页" />
        ……
</RadioGroup>
					styles.xml
<style name="MainButtonStyle">
	 <!-- Customize your theme here. -->
    <item name="android:layout_width">0dp</item>
	<item name="android:layout_height">wrap_content</item>
    <item name="android:layout_weight">1</item>
	<item name="android:button">@null</item>
    <!--   <item name="android:drawablePadding">3dp</item>-->
	<item name="android:textColor">@drawable/bottom_button_text_selector</item>
	<item name="android:textSize">10sp</item>
    <item name="android:gravity">center</item>
</style>

对于 RadioButton 的文字颜色选择器;这里使用的是checked;

  1. 使用 Butterknife 初始化布局
    a. 添加依赖:implementation 'com.jakewharton:butterknife:10.2.1' b. 在 Setting → Plugins 中输入 butterknife 添加插件;
    c. 在 Code → Generate → butterknife,选中需要的控件,生成,bingo!

3. 框架搭建

  1. 软件分包
    按功能分包,每个页面对应的所有功能,写在一个包内,所有页面所共有的功能,抽取出来;
  2. android程序架构设计 android应用程序构建实战_java_02

  3. Fragment 的基类和各个子 Fragment
    a. BaseFragment
public abstract class BaseFragment extends Fragment {
    protected Context mContext;
    /**
     * 当该类被系统创建的时候;被回调
     */
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = getActivity();
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return initView();
    }

    /**
     * 抽象类,由孩子实现,实现不同的效果
     */
    public abstract View initView() ;

    /**
     * 当 Activity 被创建了的时候回调这个方法
     */
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        initData();
    }

    /**
     * 当子类需要联网请求数据的时候,可以重写该方法,在该方法中联网请求
     */
    public void initData() {

    }
}

b. 创建各个子 Fragment

各子 Fragment 需要使用上下文时,可以使用,基类中的 mContext;
c.

  1. 初始化各个 Fragment 并且切换·
    a. 初始化各个 Fragment
    类似于 ViewPager 或者 ListView 初始化数据,新建集合并添加 new 的子 Fragment ;
    b. 初始化监听器
    设置 RadioGroup 的监听;并设置默认选中的位置,
private void initListener() {
    rgMain.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            switch (checkedId) {
                case R.id.rb_type://分类
                    position = 1;
                    break;
                	……
            }
            //根据位置取不同的Fragment
            BaseFragment baseFragment = getFragment(position);
            //切换各个 Fragment
            switchFragment(tempFragemnt, baseFragment);
        }
    });
    rgMain.check(R.id.rb_home);
}
private BaseFragment getFragment(int position) {
if (fragments != null && fragments.size() > 0) {
    BaseFragment baseFragment = fragments.get(position);
    return baseFragment;
}
return null;

b. 各个 Fragment 的切换

/**
 * 第一参数:上次显示的Fragment;第二参数:当前正要显示的Fragment
 */
private void switchFragment(Fragment fromFragment, BaseFragment nextFragment) {
    if (tempFragemnt != nextFragment) {
        tempFragemnt = nextFragment;
        if (nextFragment != null) {
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
            //判断nextFragment是否添加
            if (!nextFragment.isAdded()) {
                //隐藏当前Fragment
                if (fromFragment != null) {
                    transaction.hide(fromFragment);
                }
                //添加Fragment
                transaction.add(R.id.frameLayout, nextFragment).commit();
            } else {
                //隐藏当前Fragment
                if (fromFragment != null) {
                    transaction.hide(fromFragment);
                }
                transaction.show(nextFragment).commit();
            }
        }
    }
}