【威哥說(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