博客出自:http://blog.csdn.net/u012534831
繼上一篇博客已經(jīng)好幾個月沒發(fā)布新博客了,,中間因為教研室項目原因轉(zhuǎn)手C#幾個月,,然后又加上各種事情(再加上懶 - -,!)就落下了,并且有好多小伙伴給我留言上一篇播客的問題我都沒能解答,,在此給各位小伙伴說聲抱歉了,。 今天,又重拾安卓,,準(zhǔn)備慢慢構(gòu)建一個自己的安卓快速開發(fā)框架,,算是經(jīng)驗的總結(jié)和積累。網(wǎng)上這種東西很多,,但是對于很多初學(xué)者而言需要的是動手實踐,,與此同時,不免就有自己 的感想,,因此呢,,我也動手并分享出來和大家一起學(xué)習(xí)。
為什么我們要構(gòu)建一個BaseActivity呢,,無非因為以下兩點:
- 1,、避免重復(fù)代碼
- 2、統(tǒng)一管理
那么OK,,我們構(gòu)建一個自己的BaseActivity首先有什么需求呢,?
- 1、透明狀態(tài)欄
- 2,、生命周期監(jiān)控
- 3,、頂部統(tǒng)一的ToolBar
這是一個簡單的Base,方便我們其他的Activity直接繼承使用,。
從上面可以看出,,我們有3個需求,那么我們都放到一個BaseActivity就OK了,,在這一個Activity寫狀態(tài)欄,、toolbar、日志,。但是,,這樣的話我們?nèi)绻硞€Activity不需要toorbar或者狀態(tài)欄了怎么辦呢?是不是又不能繼承了,。所以,,我們可以將這兩個功能拆開,,寫兩個Activity,,如果不需要其中一個功能,繼承另一個就OK了,。
經(jīng)上面分析,,我們此刻需要3個Activity,,一個SuperActivity,一個StatusActivity,一個ToolBarActivity就OK了,。
package com.android.qht.BaseActivity;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import com.android.qht.Util.LogUtil;
public abstract class superActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getContentViewId());
LogUtil.e("--->onCreate");
}
public abstract int getContentViewId();
@Override
protected void onStart() {
super.onStart();
LogUtil.e("--->onStart");
}
@Override
protected void onStop() {
super.onStop();
LogUtil.e("--->onStop");
}
@Override
protected void onRestart() {
super.onRestart();
LogUtil.e("--->onRestart");
}
@Override
protected void onPause(){
super.onPause();
LogUtil.e("--->onpause");
}
@Override
protected void onResume() {
super.onResume();
LogUtil.e("--->onResume");
}
@Override
protected void onDestroy() {
super.onDestroy();
LogUtil.e("--->onDestroy");
}
}
這兒我用了一個日志工具類,,先不管。
先看下我們的superActivity
1,、重寫了所有的生命周期,,加上了日志監(jiān)控
保證我們實時監(jiān)控Activity的生命周期,這很必要,,并且我們還可以在生命周期中加入butterKnife等的綁定和解綁等操作,。
2、重寫setContentView()方法,,并加入了getContentViewId()抽象方法
重寫這個方法保證每次初始化布局時傳入我們子Activity的布局ID,,然后這個抽象方法強(qiáng)制子類重寫,傳入布局ID,,SonActivity->ToolBarActivity->SuperActivity,,這樣就保證了我們的每個界面只聽從一個布局,而不是摻雜了父類Activity的布局,。
OK,,下來再看下我們的statusActivity:
package com.android.qht.BaseActivity;
import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.LinearLayout;
import com.android.qht.myandroid.R;
public abstract class statusActivity extends superActivity {
private View statusView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setstatusColor(this, getResources().getColor(R.color.colorPrimary));//和toolbar一個顏色
}
/**
* 設(shè)置狀態(tài)欄顏色
*
* @param activity 需要設(shè)置的activity
* @param color 狀態(tài)欄顏色值
*/
public void setstatusColor(Activity activity, int color) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
// 設(shè)置狀態(tài)欄透明
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
// 生成一個狀態(tài)欄大小的矩形
// 添加 statusView 到布局中
ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
if (statusView != null) {
decorView.removeView(statusView);
}
statusView = createStatusView(activity, color);
decorView.addView(statusView);
// 設(shè)置根布局的參數(shù)
ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0);
rootView.setFitsSystemWindows(true);
rootView.setClipToPadding(true);
}
}
/**
* 生成一個和狀態(tài)欄大小相同的矩形條
*
* @param activity 需要設(shè)置的activity
* @param color 狀態(tài)欄顏色值
* @return 狀態(tài)欄矩形條
*/
private View createStatusView(Activity activity, int color) {
// 獲得狀態(tài)欄高度
int resourceId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");
int statusBarHeight = activity.getResources().getDimensionPixelSize(resourceId);
// 繪制一個和狀態(tài)欄一樣高的矩形
View statusView = new View(activity);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
statusBarHeight);
statusView.setLayoutParams(params);
statusView.setBackgroundColor(color);
return statusView;
}
/**
* 提供remove方法,在不需要狀態(tài)欄時可以移除
*/
public void removeView(Activity activity) {
ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
if (statusView != null) {
decorView.removeView(statusView);
}
}
}
- 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
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 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
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
在這個Activity中,,我們在子類傳遞的布局上面添加了一個頭部狀態(tài)欄,,顏色和ToolBar一樣。先別著急,,再看一下我們的ToolBarActivity:
package com.android.qht.BaseActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import com.android.qht.Util.ToastUtil;
import com.android.qht.myandroid.R;
/**
* ToolBar Activity.
*/
public abstract class ToolBarActivity extends statusActivity {
private TextView mToolbarTitle;
private TextView mToolbarSubTitle;
private Toolbar mToolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mToolbar = (Toolbar) findViewById(R.id.toolbar);
/*
toolbar.setLogo(R.mipmap.ic_launcher);
toolbar.setTitle("Title");
toolbar.setSubtitle("Sub Title");
*/
mToolbarTitle = (TextView) findViewById(R.id.toolbar_title);
mToolbarSubTitle = (TextView) findViewById(R.id.toolbar_subtitle);
if (mToolbar != null) {
//將Toolbar顯示到界面
setSupportActionBar(mToolbar);
}
if (mToolbarTitle != null) {
//getTitle()的值是activity的android:lable屬性值
mToolbarTitle.setText(getTitle());
//設(shè)置默認(rèn)的標(biāo)題不顯示
getSupportActionBar().setDisplayShowTitleEnabled(false);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_tool_bar, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case R.id.action_item1:
ToastUtil.showToastShort("回到首頁");
break;
case R.id.action_item2:
ToastUtil.showToastShort("分享");
break;
case R.id.action_item3:
ToastUtil.showToastShort("掃一掃");
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onStart() {
super.onStart();
/**
* 判斷是否有Toolbar,并默認(rèn)顯示返回按鈕
*/
if(null != getToolbar() && isShowBacking()){
showBack();
}
}
/**
* 獲取頭部標(biāo)題的TextView
* @return
*/
public TextView getToolbarTitle(){
return mToolbarTitle;
}
/**
* 獲取頭部副標(biāo)題的TextView
* @return
*/
public TextView getSubTitle(){
return mToolbarSubTitle;
}
/**
* 設(shè)置頭部標(biāo)題
* @param title
*/
public void setToolBarTitle(CharSequence title) {
if(mToolbarTitle != null){
mToolbarTitle.setText(title);
}else{
getToolbar().setTitle(title);
setSupportActionBar(getToolbar());
}
}
/**
* this Activity of tool bar.
* 獲取頭部.
* @return support.v7.widget.Toolbar.
*/
public Toolbar getToolbar() {
return (Toolbar) findViewById(R.id.toolbar);
}
/**
* 版本號小于21的后退按鈕圖片
*/
private void showBack(){
//setNavigationIcon必須在setSupportActionBar(toolbar);方法后面加入
getToolbar().setNavigationIcon(R.mipmap.back);
getToolbar().setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
}
/**
* 是否顯示后退按鈕,默認(rèn)顯示,可在子類重寫該方法.
* @return
*/
protected boolean isShowBacking(){
return true;
}
}
- 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
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 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
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
我們在ToorBarActivity中寫了ToorBar的實現(xiàn),,因為我們的ToolBar是include方式加入到子Activity中的,所以我們是按照正常的方式初始化ToolBar并寫了它的一些方法,。
最終我們的加載順序是這樣的:
1,、先加載子Activity的Layout(包括ToolBar)
2、再加載頂部狀態(tài)欄
3,、再初始化ToolBar(findviewbyid)
4,、再初始化其他控件(findviewbyid)
總體的過程就是這樣,我這個BaseActivity比較簡單,,只是幫助入門者建立一個這樣的構(gòu)建思想,,建立自己的框架概念和體系。
下一篇我會帶大家一起封裝一些常用的工具類+ButterKnife+retrofit+RXJava,,敬請期待,。
csdn地址:http://blog.csdn.net/u012534831
github地址:https://github.com/qht1003077897
QQ:1003077897
歡迎交流。
|