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

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

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

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

項(xiàng)目介紹:

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

項(xiàng)目模塊:

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

用到的技術(shù):

xutils框架的使用

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

Android四大組件之一SharedPreferences

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

使用GridView完成首頁(yè)布局

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

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

先按照組件區(qū)分,然后再按照功能模塊,例如:引導(dǎo)頁(yè)這種雖然也是Activity,但是由于使用頻次非常有限,所以,單獨(dú)放到guide包中,這樣看起來(lái)更加簡(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)頁(yè)的實(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)頁(yè)要顯示當(dāng)前應(yīng)用的版本,參照代碼。另外啟動(dòng)后要判斷是否第一次啟動(dòng)本應(yīng)用,如果是第一次,就跳轉(zhuǎn)到引導(dǎo)頁(yè),否則跳轉(zhuǎn)到登錄頁(yè)面。這里用到了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)用的名稱,其它沒(méi)有什么。

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,572評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,071評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 175,409評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 62,569評(píng)論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,360評(píng)論 6 404
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 54,895評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,979評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 42,123評(píng)論 0 286
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,643評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,559評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,742評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,250評(píng)論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 43,981評(píng)論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 34,363評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 35,622評(píng)論 1 280
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,354評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,707評(píng)論 2 370

推薦閱讀更多精彩內(nèi)容

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