前言

在看基础内容的时候发现纯看知识点学习的效果不高,还是需要在实践中才能收获更多,今天的学习内容是搭建基础的软件框架。

一、启动页面

1,启动页面的布局

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:gravity="center"
android:background="#fff"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icon_login_logo"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="欢迎进入。。。。。"/>
</LinearLayout>

2,启动页面的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class SplashActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.splash_activity);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//在主线程中执行
intentToMainactivity(); //跳转到主页面
}
}, 2000);
}

private void intentToMainactivity() {
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
finish();
}
}

二、主页面

1,主页面的布局

主页面其实就是通过底部导航栏来切换Fragment,有人就会问为什么要使用Fragment来切换呢,不用Activity呢?因为这个需要整个页面的改变,也就没有必要新建一个Activity,在Activity中可以动态的添加、删除、更换Fragment,并且这些Fragment都有独立的布局,能够进行事件响应,所以我们只需要创建一个Activity,通过这个页面来打开其他的Fragment。

主页面的布局

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:background="#fff"
android:orientation="vertical"
android:layout_height="match_parent"
tools:context=".MainActivity">

<FrameLayout
android:id="@+id/fragmnet_main"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="0dp" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#eee" />
<RadioGroup
android:id="@+id/rg_main"
android:layout_width="match_parent"
android:padding="5dp"
android:orientation="horizontal"
android:layout_height="wrap_content">

<RadioButton
android:id="@+id/recommend_button"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:button="@android:color/transparent"
android:drawableTop="@drawable/recommend_select"
android:textColor="@drawable/recommend_select_text"
android:paddingTop="6dp"
android:gravity="center"
android:background="@null"
android:text="首页"/>
<RadioButton
android:id="@+id/calendar_button"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:button="@android:color/transparent"
android:drawableTop="@drawable/calendar_select"
android:textColor="@drawable/recommend_select_text"
android:paddingTop="6dp"
android:gravity="center"
android:background="@null"
android:text="日签"/>
<RadioButton
android:id="@+id/put_button"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:button="@android:color/transparent"
android:drawableTop="@drawable/put_out_select"
android:textColor="@drawable/recommend_select_text"
android:paddingTop="6dp"
android:gravity="center"
android:background="@null"
android:text="发布"/>
<RadioButton
android:id="@+id/message_button"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:button="@android:color/transparent"
android:drawableTop="@drawable/message_select"
android:textColor="@drawable/recommend_select_text"
android:paddingTop="6dp"
android:gravity="center"
android:background="@null"
android:text="消息"/>
<RadioButton
android:id="@+id/mine_button"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:button="@android:color/transparent"
android:drawableTop="@drawable/mine_select"
android:textColor="@drawable/recommend_select_text"
android:paddingTop="6dp"
android:background="@null"
android:gravity="center"
android:text="我的"/>
</RadioGroup>
</LinearLayout>

//这是其中的一个 calendar_select
//通过这个可以获取到点击时和未点击时的按钮不同的状态
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="false">
<layer-list>
<item android:width="25dp" android:height="25dp" android:drawable="@drawable/calendar"></item>
</layer-list>
</item>
<item android:state_checked="true">
<layer-list>
<item android:width="25dp" android:height="25dp" android:drawable="@drawable/calendar_active"></item>
</layer-list>
</item>
</selector>

2,实例化布局控件

1
2
3
4
5
6
initView();

private void initView() {
fragmnet_main = (FrameLayout) findViewById(R.id.fragmnet_main);
rg_main = (RadioGroup) findViewById(R.id.rg_main);
}

三、创建各自子页面

1、创建BaseFragment

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return initView();
}

//强制子类重写,实现特定的ui
protected abstract View initView();

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initData();
}

//当子fragment需要初始化值,或者联网请求绑定数据,展示数据
protected void initData() {
}
}

2、定义各个子页面

子页面我就只给出一个代码实例了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class CalendarFragment extends BaseFragment {

private TextView textView;

@Override
protected View initView() {
textView = new TextView(mContext);
textView.setTextSize(20);
textView.setGravity(Gravity.CENTER);
textView.setTextColor(Color.BLUE);
return textView;
}

@Override
protected void initData() {
super.initData();
textView.setText("日签页面");
}
}

下面的这几个步骤都是在主页面中实现的

3、初始化Fragment

1
2
3
4
5
6
7
8
9
10
11
//初始化fragment
initFragment();

private void initFragment() {
mBaseFragment = new ArrayList<>();
mBaseFragment.add(new RecommendFragment());
mBaseFragment.add(new CalendarFragment());
mBaseFragment.add(new PutFragemnt());
mBaseFragment.add(new MessageFragment());
mBaseFragment.add(new MineFragment());
}

4、设置RadioGroup的监听

5、得到Fragment

6、切换Fragment

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
//监听事件
initListener();

private void initListener() {
rg_main.setOnCheckedChangeListener(new mCheckedChangeListener());
rg_main.check(R.id.calendar_button);
}


class mCheckedChangeListener implements RadioGroup.OnCheckedChangeListener{

@Override
public void onCheckedChanged(RadioGroup radioGroup, int i) {
switch (i){
case R.id.recommend_button:
position = 0;
break;
case R.id.calendar_button:
position = 1;
break;
case R.id.put_button:
position = 2;
break;
case R.id.message_button:
position = 3;
break;
case R.id.mine_button:
position = 4;
break;
default:
position = 0;
break;
}

//根据位置得到fragment
BaseFragment to = getFragment();
//切换fragment
switchFragment(currentFragment, to);
}
}


private void switchFragment(BaseFragment fragment) {
//得到fragmentManager
FragmentManager fm = getSupportFragmentManager();
//开启事务
FragmentTransaction transaction = fm.beginTransaction();
//替换
transaction.replace(R.id.fragmnet_main, fragment);
//提交事物
transaction.commit();
}


private BaseFragment getFragment() {
BaseFragment fragment = mBaseFragment.get(position);
return fragment;
}

4、性能优化

如果使用上述功能去切换Fragment会导致重新创建Fragment问题,所以我们需要优化,减少不必要的消耗。

思路这样的,在切换的时候,先判断是否切换到了其他页面,如果是就进行切换,如果不是就不进行操作,在切换到其他页面的时候也需要做一个判断,当前页面是否被创建了,如果没有被创建就需要创建这个页面然后显示,如果被创建了就直接显示这个页面。

代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
*
* @param from 当前的fragment,快要消失
* @param to 切换到的fragment, 快要出现
*/

private void switchFragment(Fragment from, Fragment to) {
if(from != to){
currentFragment = to;
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
//判断有没有被添加
if(!to.isAdded()){
//添加 from隐藏 to添加
if(from != null){
ft.hide(from);
}
if(to != null){
ft.add(R.id.fragmnet_main, to).commit();
}
} else {
//切换 from隐藏 to显示
if(from != null ){
ft.hide(from);
}
if(to != null){
ft.show(to).commit();
}
}
}
}