0. 前言
本文将对github上 liuling
开发的基于Material Design和MVP的《简易新闻》源码进行简要分析,通过本文你将学到:
- 阅读应用源码的步骤
- RecyclerView
- NavigationView
- 下拉刷新和上拉加载
- Material过渡动画
- CollapsingToolbarLayout
1. 寻找入口
分析一个应用就是从MainActivity下手,那么如何找到MainActivity呢?当然还是通过Manifest文件,不过,在进入Manifest文件前,我们先来看看工程的一个结构。
1.1 工程总览
工程的目录结构如上图所示,有两个Module,一个是应用本身,还有一个是导入的swipeback库,用于滑动返回,如图:
1.2 Manifest文件
1.2.1 权限声明
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
首先声明了权限,分别是网络相关和位置相关的权限。
1.2.2 应用层
<application
...
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".main.widget.MainActivity" ... >
...
</activity>
...
</application>
这里Application标签中有一个属性 android:supportsRtl="true"
是什么意思呢?这是Android 4.2的一个新特性 layoutRtl,主要是方便开发者去支持阿拉伯语/波斯语等从右到左的阅读习惯。
接下来指明了两个主要的Activity:
- MainActivity
- NewsDetailActivity
2. MainActivity
public class MainActivity extends AppCompatActivity implements MainView
主Activity实现了MainView接口,所以我们来先看看该接口:
*
2.1 MainView接口
接口很简单,包含四个方法声明,分别是主界面的四个拨动页面。
public interface MainView {
void switch2News();
void switch2Images();
void switch2Weather();
void switch2About();
}
2.2 onCreate()方法
2.2.1 布局文件
首先来看主布局文件,布局可以说是简单易懂,清晰明了。一个DrawerLayout中夹了协调布局包裹的FrameLayout作为主界面和一个NavigationView。
其中值得注意的是就是这个NavigationView:
<android.support.design.widget.NavigationView
android:id="@+id/navigation_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/navigation_header"
app:menu="@menu/navigation_menu" />
app:headerLayout
属性: 头布局文件,及抽屉上方的个人头像。说起头像,就要用到CircleImageView,相信也会有读者像我一样曾经好奇过CircleImageView用来干什么,怎么用吧,没错,就是这样用的:
<de.hdodenhof.circleimageview.CircleImageView
android:id="@+id/profile_image"
android:layout_width="72dp"
android:layout_height="72dp"
android:layout_marginTop="20dp"
android:src="@drawable/protrait"
app:border_color="@color/primary_light"
app:border_width="2dp" />
app:menu
属性: 使用菜单来填充选项,大家就不要以为只可以使用ListView自定义来实现菜单选择咯,但是笔者认为这里有个缺陷就是,抽屉会默认遮住状态栏和Toolbar。
<group android:checkableBehavior="single">
<item
android:id="@+id/navigation_item_news"
android:icon="@drawable/ic_assessment_white_24dp"
android:checked="true"
android:title="@string/navigation_news" />
...
</group>
2.2.2 初始化视图
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, mToolbar, R.string.drawer_open,
R.string.drawer_close);
mDrawerToggle.syncState();
mDrawerLayout.setDrawerListener(mDrawerToggle);
mNavigationView = (NavigationView) findViewById(R.id.navigation_view);
setupDrawerContent(mNavigationView);
private void setupDrawerContent(NavigationView navigationView) {
navigationView.setNavigationItemSelectedListener(
new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
mMainPresenter.switchNavigation(menuItem.getItemId());
menuItem.setChecked(true);
mDrawerLayout.closeDrawers();
return