分享磨礪營(yíng)馬劍威講解-Android實(shí)戰(zhàn)項(xiàng)目第一彈,連載中

【威哥說】本系列文章會(huì)帶領(lǐng)大家開發(fā)完成一個(gè)完整的Android項(xiàng)目,進(jìn)行詳細(xì)的講解,根據(jù)項(xiàng)目的進(jìn)度,規(guī)劃為6節(jié)課,也就是6篇系列文章,歡迎大家關(guān)注。下面咱們開始第一講。

開發(fā)環(huán)境:

本節(jié)把項(xiàng)目的基本框架搭起來,開發(fā)環(huán)境我們使用最新的Android Studio,現(xiàn)在除非有特殊需求,否則,不建議使用Eclipse。下載資源的話這里給大家推薦個(gè)網(wǎng)站:http://www.androiddevtools.cn/,基本上Android開發(fā)所有相關(guān)資源和工具這里都能夠下載到。

項(xiàng)目介紹:

整體實(shí)現(xiàn)了記錄事件的功能,記錄各種事件和消費(fèi)等。

項(xiàng)目模塊:

項(xiàng)目模塊有啟動(dòng)頁、引導(dǎo)頁、用戶登錄、用戶注冊(cè)、首頁、功能等模塊。

用到的技術(shù):

xutils框架的使用

項(xiàng)目引導(dǎo)頁滑動(dòng)效果實(shí)現(xiàn)-ViewPager詳解

Android四大組件之一SharedPreferences

Android注冊(cè)登錄之基礎(chǔ)UI控件的使用

使用GridView完成首頁布局

數(shù)據(jù)庫(kù)的增刪改查

好,這篇我們就開始搭建框架結(jié)構(gòu),由于項(xiàng)目相對(duì)比較簡(jiǎn)單,這里只進(jìn)行基本的抽象封裝,引入思路,供大家參考。項(xiàng)目的分包問題,在這里有必要給大家說下,很多學(xué)員都有這個(gè)疑問,到底按照組件分還是功能模塊來分呢?其實(shí),這個(gè)還是要相對(duì)實(shí)際項(xiàng)目而言,確實(shí)這兩種方式都存在,當(dāng)然,還有混合方式,Android項(xiàng)目,我個(gè)人比較喜歡混合方式分包。這個(gè)項(xiàng)目就是用這樣的方式,大家可以參考。

先按照組件區(qū)分,然后再按照功能模塊,例如:引導(dǎo)頁這種雖然也是Activity,但是由于使用頻次非常有限,所以,單獨(dú)放到guide包中,這樣看起來更加簡(jiǎn)潔,避免文件混亂。

這是Activity的封裝:

public abstract class MyActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

initView();

initData();

}

protected abstract void initView();

protected abstract void initData();

}

這樣所有的Activity都繼承這個(gè)抽象父類,所有的Ui操作全部放到initView()方法中,所有的數(shù)據(jù)加載全部放到initData()方法中,怎么樣?這樣代碼是不是簡(jiǎn)潔、清晰多了。

按照這里思路,你是不是想到了Toast? 對(duì)的,Toast和startActivity等,類似的操作全部可以封裝到MyActivity中,好處當(dāng)然是少寫很多代碼,調(diào)用方便,不容易出錯(cuò)誤,后期維護(hù)也更加簡(jiǎn)單,因?yàn)槿肟谥挥幸粋€(gè)。

總結(jié)下就是所有子類共同的地方都可以提取到父類中進(jìn)行抽象,還有Adapter、Fragment等等,一樣的道理,有了這個(gè)思想就可以了。

下面是啟動(dòng)頁的實(shí)現(xiàn):

布局文件:

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:id="@+id/spalsh_layout"

tools:context=".activity.SplashActivity">

android:layout_width="match_parent"

android:layout_height="match_parent"

android:src="@mipmap/app_spalsh_home"

android:scaleType="fitXY"

/>

android:id="@+id/version_name_textview"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="版本3.3.1"

android:layout_alignParentBottom="true"

android:textColor="#ffffff"

android:layout_marginBottom="20dp"

android:layout_centerHorizontal="true"

android:shadowDx="1"

android:shadowDy="1"

android:shadowRadius="2"

/>

代碼:

public class SplashActivity extends MyActivity {

private final int SPLASH_START_TIME = 3000;

private final String FIRST_RUN_APP = "firstapp";

private SharedXmlUtil mSharedXmlUtil;

private TextView mVersionTextView;

@Override

public void initView() {

setContentView(R.layout.activity_spalsh);

mVersionTextView = (TextView) findViewById(R.id.version_name_textview);

// ? ? ? ?setContentView(R.layout.activity_spalsh);

mSharedXmlUtil = new SharedXmlUtil(this);

mVersionTextView.setText("當(dāng)前版本:" + getVersionName());

mVersionTextView.post(new Runnable() {

@Override

public void run() {

}

});

final boolean first = mSharedXmlUtil.read(FIRST_RUN_APP, true);

new Handler().postDelayed(new Runnable() {

@Override

public void run() {

if (first) {

mSharedXmlUtil.write(FIRST_RUN_APP, false);

startActivity(new Intent(SplashActivity.this, ViewPagerActivity.class));

SplashActivity.this.finish();

} else {

startActivity(new Intent(SplashActivity.this, LoginActivity.class));

SplashActivity.this.finish();

}

}

}, SPLASH_START_TIME);

//加入淡入淡出的效果

AlphaAnimation alphaAnimation = new AlphaAnimation(0,1);

alphaAnimation.setDuration(3000);

RelativeLayout layout = (RelativeLayout) findViewById(R.id.spalsh_layout);

layout.startAnimation(alphaAnimation);

}

/**

* 獲取版本名稱,從build文件獲取

*/

private String getVersionName() {

//1.包管理者對(duì)象

PackageManager packageManager = getPackageManager();

try {

//2.從包的管理者對(duì)象中,獲取指定包名的基本信息(版本名稱,版本號(hào))傳0代表獲取基本信息

PackageInfo info = packageManager.getPackageInfo(getPackageName(), 0);

String versionName = info.versionName;

return versionName;

} catch (PackageManager.NameNotFoundException e) {

e.printStackTrace();

}

return null;

}

}

這里啟動(dòng)頁要顯示當(dāng)前應(yīng)用的版本,參照代碼。另外啟動(dòng)后要判斷是否第一次啟動(dòng)本應(yīng)用,如果是第一次,就跳轉(zhuǎn)到引導(dǎo)頁,否則跳轉(zhuǎn)到登錄頁面。這里用到了SharedPreferences,我封裝了一下,代碼如下:

public class SharedXmlUtil {

public SharedXmlUtil mSharedXmlUtil;

private SharedPreferences mShared;

private Editor mEditor;

public SharedXmlUtil(Context context, String filename) {

mShared = context.getSharedPreferences(filename, Context.MODE_PRIVATE);

mEditor = mShared.edit();

}

public SharedXmlUtil(Context context) {

mShared = context.getSharedPreferences(context.getString(R.string.app_name), Context.MODE_PRIVATE);

mEditor = mShared.edit();

}

public void write(String key, String value) {

mEditor.putString(key, value);

mEditor.commit();

}

public void write(String key, boolean value) {

mEditor.putBoolean(key, value);

mEditor.commit();

}

public void write(String key, int value) {

mEditor.putInt(key, value);

mEditor.commit();

}

public void write(String key, float value) {

mEditor.putFloat(key, value);

mEditor.commit();

}

public void write(String key, long value) {

mEditor.putLong(key, value);

mEditor.commit();

}

public String read(String key, String defValue) {

return mShared.getString(key, defValue);

}

public boolean read(String key, boolean defValue) {

return mShared.getBoolean(key, defValue);

}

public int read(String key, int defValue) {

return mShared.getInt(key, defValue);

}

public float read(String key, float defValue) {

return mShared.getFloat(key, defValue);

}

public long read(String key, long defValue) {

return mShared.getLong(key, defValue);

}

public void delete(String key) {

mEditor.remove(key);

mEditor.commit();

}

}

兩個(gè)構(gòu)造方法,第二個(gè)為默認(rèn)名,應(yīng)用的名稱,其它沒有什么。

好,本節(jié)的項(xiàng)目介紹和封裝框架就說到這里,下節(jié)內(nèi)容是引導(dǎo)頁的實(shí)現(xiàn),動(dòng)態(tài)加入圓點(diǎn)標(biāo)記,記得看。感謝關(guān)注,不要忘記點(diǎn)贊哦?。?!咱們下節(jié)再見!

本文出自微信公眾號(hào)mjw-java更多內(nèi)容關(guān)注微信公眾號(hào)或訪問www.moliying.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 7,336評(píng)論 0 17
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,068評(píng)論 25 709
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評(píng)論 19 139
  • 今天我們的主要內(nèi)容就是安卓的主要幾個(gè)基礎(chǔ)的布局方式。(主要布局如下:) 1.線性布局(LinerLayout) 2...
    磨礪營(yíng)IT閱讀 5,438評(píng)論 3 70
  • 近日事多發(fā),起床又思及夢(mèng)境,加之身感天清氣明,遂有感而發(fā),筆陣于此,念及文筆拙劣,索先致歉,若有不妥,還...
    木易向水閱讀 469評(píng)論 2 1

友情鏈接更多精彩內(nèi)容