Android项目实战:商城APPday01框架搭建
- day01
- 内容
- 1. 启动页面
- 2. 主页面
- 3. 框架搭建
- 盲区
- 其他实战
- 商城
- 新闻
不否认努力,继续加油!
学习整理重点、盲区,笔记如下:干干巴巴,麻麻赖赖,一点都不圆润……
源码 已上传至集哈:ShoppingMall.
https://github.com/SmileAlfred/ShoppingMall
day01
内容
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. 主页面
- 效果图如下:分析:总体为线性布局,下面是 RadioGroup,上面是 帧布局,替换不同的 FragmentLayout;
- 布局文件:
<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;
- 使用 Butterknife 初始化布局
a. 添加依赖:implementation 'com.jakewharton:butterknife:10.2.1'
b. 在 Setting → Plugins 中输入 butterknife 添加插件;
c. 在 Code → Generate → butterknife,选中需要的控件,生成,bingo!
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.
- 初始化各个 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();
}
}
}
}