《简易新闻》源码分析

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 
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值