Android側邊導航欄+ListView基礎實踐

Android基礎項目實踐

文章首發於自己的github博客,https://lemonjuice98.github.io/
本學期學習了Android的開發課程,期末也做了一款很萌新向的App作爲課程的內容輸出吧。

這篇博客就拿來記錄一下開發過程和相關內容吧

0x01 前言

言歸正傳,首先說一說做這麼一款App的想法。

一個是出於完成課程報告的角度(有一些要求),另一個就是學了很多確實想做點什麼。至於爲什麼做這個,起初也考慮過仿一些常用的App的想法,但是心裏總是不太願意,想做些沒有的。(纔不是嫌麻煩呢)
正好那段時間玩着一款遊戲《Monster Hunter:World》(怪物獵人),於是就萌生了做一個非官方普及向的App的想法。

效果圖如下

0x02 需求分析

  • PC版官方新聞信息
  • 查詢(包括但不限於怪物、武器、裝飾珠)
  • 圖鑑(怪物、武器)
  • 配裝器相關

0x03 總體設計

  1. 文件樹結構及作用
    Java文件樹:
    Java文件樹
    Start: 啓動動畫活動
    MainActivity: 應用主活動
    MyDatabaseHelper: 數據庫輔助
    News: 新聞的類,規定數據類型和相關方法
    NewsAdapter: 適配器
    NewsInfo: 點擊查看新聞詳情的活動
    TuJian: 圖鑑的類,規定數據類型和相關方法
    TuJianAdapter: 適配器
    TuJian_Activity: 顯示圖鑑的活動

  2. 數據庫相關
    由於遊戲內數據多,且除新聞外的其他資料基本不會發生變動,固採用將外置數據庫寫入到手機中的方式

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 側邊欄

  1. 這個效果需要DrawerLayout的支持,要在build.gradle中添加

    implementation ‘com.android.support:design:27.1.1’

  2. 在對應的layout中採用

    android.support.v4.widget.DrawerLayout 的佈局格式

  3. 在layout佈局中需要聲明

    xmlns:app=“http://schemas.android.com/apk/res-auto

  4. 進行設置

    <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> 
    
  5. 對應活動的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太醜了
其他各個方面也會完成更多的優化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章