Android基礎項目實踐
文章首發於自己的github博客,https://lemonjuice98.github.io/
本學期學習了Android的開發課程,期末也做了一款很萌新向的App作爲課程的內容輸出吧。
這篇博客就拿來記錄一下開發過程和相關內容吧
0x01 前言
言歸正傳,首先說一說做這麼一款App的想法。
一個是出於完成課程報告的角度(有一些要求),另一個就是學了很多確實想做點什麼。至於爲什麼做這個,起初也考慮過仿一些常用的App的想法,但是心裏總是不太願意,想做些沒有的。(纔不是嫌麻煩呢)
正好那段時間玩着一款遊戲《Monster Hunter:World》(怪物獵人),於是就萌生了做一個非官方普及向的App的想法。
效果圖如下
0x02 需求分析
- PC版官方新聞信息
- 查詢(包括但不限於怪物、武器、裝飾珠)
- 圖鑑(怪物、武器)
- 配裝器相關
0x03 總體設計
-
文件樹結構及作用
Java文件樹:
Start: 啓動動畫活動
MainActivity: 應用主活動
MyDatabaseHelper: 數據庫輔助
News: 新聞的類,規定數據類型和相關方法
NewsAdapter: 適配器
NewsInfo: 點擊查看新聞詳情的活動
TuJian: 圖鑑的類,規定數據類型和相關方法
TuJianAdapter: 適配器
TuJian_Activity: 顯示圖鑑的活動 -
數據庫相關
由於遊戲內數據多,且除新聞外的其他資料基本不會發生變動,固採用將外置數據庫寫入到手機中的方式
0x04 詳細設計
啓動頁面
利用漸變處理圖片,通過一個定時器來計算時間實現主活動的跳轉
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_start);
StartLogo = (LinearLayout) findViewById(R.id.Start_Logo);
TimerTask task = new TimerTask(){ //設置一個任務
public void run(){
Intent intent = new Intent(Start.this, MainActivity.class);
startActivity(intent);
}
};
Timer timer = new Timer();
timer.schedule(task, 2000); //2000ms後執行任務
beginAnimation();
}
private void beginAnimation() {
AlphaAnimation alpha = new AlphaAnimation(0, 1); //漸變
alpha.setDuration(2000);
StartLogo.startAnimation(alpha);
}
主活動
- 首先,解決啓動動畫只在第一次打開App時啓動且主活動按返回鍵時直接退出
@Override //重寫返回鍵功能,設置爲冷啓動
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);
return true;
}
return super.onKeyDown(keyCode, event);
}
- 完成外置數據庫的寫入
public void initDB() { //初始化數據庫
String DATABASE_PATH = "/data/data/com.example.administrator.mhw/databases/"; //這裏是軟件對應的數據庫所在路徑
String DATABASE_NAME = "MHW.db"; //數據庫名稱
File fileDB = new File(DATABASE_PATH + DATABASE_NAME); //拼接完整的路徑
if( !fileDB.exists() ) { //檢測是否已存在數據庫
File file = new File(DATABASE_PATH);
if(!file.exists())
file.mkdirs();
try { //寫入數據
InputStream is = getBaseContext().getAssets().open(DATABASE_NAME);
OutputStream os = new FileOutputStream(DATABASE_PATH + DATABASE_NAME);
byte[] buffer = new byte[1024];
int len;
while((len = is.read(buffer)) > 0) {
os.write(buffer, 0, len);
}
os.flush();
os.close();
is.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
- 官方活動信息的ListView
原本是想通過爬蟲來爬取官方活動信息,存儲在數據庫中再進行讀寫,但是我真的菜,只會一點Python的,Java不會,就暫且擱置了
這裏直接錄入了幾條新聞來替代。但是這一塊的設計完全能支持上述想法,有很好的內聚性。
(代碼就是很基礎的ListView代碼,就不放出來了,文末有項目連接,可下載查看)
新聞詳情頁
這個是從主頁活動通過點擊某個新聞,跳轉到該新聞的詳情頁面。
在主活動中獲取對應的item,將其中的內容通過活動之間的傳值來交給這個活動,避免了此活動再次遍歷數據庫查找所需的數據,優化了性能
圖鑑頁
目前做的也是很普通,也只是一個簡單的ListView,沒什麼特別的
(後續還會進行優化 我自己也有點看不下去)
0x05 側邊欄
-
這個效果需要DrawerLayout的支持,要在build.gradle中添加
implementation ‘com.android.support:design:27.1.1’
-
在對應的layout中採用
android.support.v4.widget.DrawerLayout 的佈局格式
-
在layout佈局中需要聲明
xmlns:app=“http://schemas.android.com/apk/res-auto”
-
進行設置
<android.support.design.widget.NavigationView android:id="@+id/nav" android:layout_width="200dp" android:layout_height="match_parent" android:layout_gravity="start" //這裏常用start,也有left和right可選,可自行嘗試。但是必須設置此屬性 android:layout_centerVertical="true" android:layout_centerHorizontal="true" //下述兩個屬性需要申明3中的app才能正常編譯 app:menu="@menu/nav_menu" //側邊欄導航樣式 app:headerLayout="@layout/nav_header"> //側邊欄頭圖樣式 </android.support.design.widget.NavigationView>
-
對應活動的Java代碼中設置點擊事件
NavigationView navigationView = (NavigationView) findViewById(R.id.nav); navigationView.setItemIconTintList(null); //設置導航小圖標背景爲空 navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem menuItem) { switch (menuItem.getItemId()) { case ...: break; ... return true; } });
0x06 動態綁定圖片
理想情況是,新聞是由爬蟲進行爬取,存儲後讀取並顯示,對應的圖片也轉存在drawable文件夾下。
此時無法通過固定的方式將圖片綁定到對應的ListView項中去,只能通過下述方法完成此操作。
爬取圖片時命名與標題相關,就可以通過標題字符串來一對一的查找該新聞的圖片
String str = "news"+news.getId(); //拼接字符串
int resid = context.getResources().getIdentifier(str, "drawable", "com.example.administrator.mhw"); //獲取所需圖片的id號
NewsImage.setImageResource(resid); //給對應的圖片控件設置圖片
0x07 相關提示
-
Start.java爲啓動動畫,這是一個活動,因此因將Ta設爲 Launch Activity
-
關於隱藏軟件標題欄
在values文件夾下的styles.xml中設置<item name="windowNoTitle">true</item>
-
側邊欄的頭圖佈局nav_header.xml放在layout文件夾下
導航欄佈局nav_menu.xml需要在res文件夾下新建menu文件夾進行存放
0x08 項目地址
https://github.com/LemonJuice98/Android
歡迎評論留言~
0x09 後續
這個成品是個半成品,後續會努力做出首頁活動的爬蟲,完成這個模塊應該有的樣子
其次,首頁活動列表會考慮別的樣式。純ListView太醜了、
其他各個方面也會完成更多的優化