我的项目源码托管地址:点击打开我的项目源码地址
这里面会讲一些通用的,但是未涉及到个例,因为后续一系列的md的base都是基于此实现的
不知道大家的习惯是什么,除去一些统一的init放在application中,比如fragment,activity我都习惯写个base,不想当代码搬运工所以懒人有懒办法
我的这一系列项目都是依据basicactivity这个模板建的,在这大体说一下模板内容,以及一些坑,先看一下xml吧,模板默认建两个xml,可以简单理解为父子,其中coordinatorlayout这货作用挺大的,而且有些效果必须要让他做父
就拿base来举例子activity_base.xml
<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout 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:layout_height="match_parent" android:fitsSystemWindows="true" tools:context="com.fanyafeng.materialdesign.BaseActivity"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:layout_scrollFlags="scroll|enterAlways" app:popupTheme="@style/AppTheme.PopupOverlay"> <TextView android:id="@+id/toolbar_center_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" /> </android.support.v7.widget.Toolbar> </android.support.design.widget.AppBarLayout> <include layout="@layout/content_base" /> <android.support.design.widget.FloatingActionButton android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|end" android:layout_margin="@dimen/fab_margin" android:src="@android:drawable/ic_dialog_email" /> </android.support.design.widget.CoordinatorLayout>然后看content_base.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:showIn="@layout/activity_base" tools:context="com.fanyafeng.materialdesign.BaseActivity"> <TextView android:text="Hello World!" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout>你可能感觉xml基本就这点玩意,可是还没有完,真的还没有完,还有挺重要的menu
<menu 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" tools:context="com.fanyafeng.materialdesign.BaseActivity" > <item android:id="@+id/action_settings" android:title="@string/action_settings" android:orderInCategory="100" app:showAsAction="never" /> </menu>这里简单说一下如果项目中没有拿toolbar作为项目所有的头bar那你可以不用关注这个,但是如果用的话还是很重要的,后文有专门讲解这个
再来看最重要的baseactivity
package com.fanyafeng.materialdesign; import android.content.DialogInterface; import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.View; import android.view.Menu; import android.view.MenuItem; import android.widget.TextView; import com.fanyafeng.materialdesign.R; import java.util.Objects; public class BaseActivity extends AppCompatActivity implements View.OnClickListener { protected Toolbar toolbar; protected FloatingActionButton fab; protected TextView toolbar_center_title; protected boolean isShowToolbar = true; protected boolean isSetNavigationIcon = true; protected boolean isSetLogo = false; protected boolean isShowEmail = true; protected String title; protected String centertitle; protected String subtitle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public void onClick(View v) { } @Override protected void onResume() { super.onResume(); toolbar = (Toolbar) findViewById(R.id.toolbar); toolbar_center_title = (TextView) findViewById(R.id.toolbar_center_title); fab = (FloatingActionButton) findViewById(R.id.fab); if (toolbar != null) { if (isShowToolbar) { setSupportActionBar(toolbar); } else { toolbar.setVisibility(View.GONE); } if (title != null && !title.equals("")) { toolbar.setTitle(title); } if (subtitle != null && !subtitle.equals("")) { toolbar.setSubtitle(subtitle); } if (isSetNavigationIcon) { // 由于要兼容低版本,所以采用这个划杠的方法 toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.back)); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); } if (isSetLogo) { toolbar.setLogo(getResources().getDrawable(R.drawable.menu)); } if (toolbar_center_title != null) { if (centertitle != null && !centertitle.equals("")) { toolbar_center_title.setText(centertitle); } else { toolbar_center_title.setText(""); } } } if (fab != null) { fab.setVisibility(isShowEmail ? View.VISIBLE : View.GONE); } } }在这里为了代码的简洁我注释掉了两个重写方法,如果用menu的话还是很重要的,后文会明确讲到,来看一下定义以及作用
toolbar这个不用说了就是所有的子类的toolbar,而且注意是修饰符是protected
fab是floatactionbutton
toolbar_center_title这个是标题,不是toolbar自带的,而且可以自定义位置的,原来我也用actionbar并且写过类似的,博客历史中有,但是没有应用到实际项目中,因为局限性太大,可是toolbar相对灵活许多,并且在项目用运用的很好
剩下的几个字段顾名思义吧,说一下title和subtitle,这是toolbar自带的定义标题,一个是大标题一个是二级标题,再有就是navigation返回键,logo
最后来一张图