1. 程式人生 > >Android專案仿駕校寶典的答題APP

Android專案仿駕校寶典的答題APP

首先看到的是這款APP,它的外形如下圖所示:
這裡寫圖片描述

當我們第一次安裝該軟體時,第一次開啟,進入的是導航頁面,導航頁面採用的是ViewPager+viewpagerindicator+Activity實現側滑導航頁的效果,而以後開啟進入的是啟動頁面此效果採用的是SharedPreferences,實現程式碼如下:

package com.zking.sj_test_android;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Handler;
import
android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; public class WelcomeActivity extends AppCompatActivity { private boolean isFirstUse; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_welcome); //表示當前儲存的狀態可以被其他檔案讀取
SharedPreferences preferences=getSharedPreferences("isFirstUse", MODE_WORLD_READABLE); //定義isFirstUse初始狀態為true isFirstUse=preferences.getBoolean("isFirstUse", true); new Handler().postDelayed(new Runnable() { @Override public void run() { // TODO Auto-generated method stub
if(isFirstUse==true) //isFirstUes為true,跳轉到IndicatorActivity,這個activity就是導航頁 { Log.i("test","aa"+isFirstUse); Intent intent1=new Intent(WelcomeActivity.this,IndicatorActivity.class); WelcomeActivity.this.startActivity(intent1); WelcomeActivity.this.finish(); } else { Log.i("test","bb"+isFirstUse); //否則跳轉到首頁 Intent intent=new Intent(WelcomeActivity.this, SplashActivity.class); WelcomeActivity.this.startActivity(intent); WelcomeActivity.this.finish(); } } },0); SharedPreferences.Editor editor = preferences.edit(); //存入資料,改寫成false,下次啟動就不會再進入導航頁了 editor.putBoolean("isFirstUse", false); //提交修改 editor.commit(); } }

主頁面採用ViewPager+fragment,碎片全城策劃採用的佈局LinearLayout+GridLayout實現的

這裡寫圖片描述

報名階段,科目二,科目三,新手上路,發現都是載入靜態網頁實現的,主要程式碼如下

package com.zking.sj_test_android;

import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

public class Newuser1Activity extends AppCompatActivity {

    private WebView webview;
    private View mErrorView;
    private WebSettings mWebSettings;
    private RelativeLayout loading_over;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_newuser1);
        webview = (WebView) findViewById(R.id.webview);
        webview = (WebView) findViewById(R.id.webview);
        loading_over = (RelativeLayout) findViewById(R.id.loading_over);
        setUpView();
        findViewById(R.id.id).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AndroidShare androidShare = new AndroidShare(Newuser1Activity.this);
                androidShare.shareOthers("標題", "Although it rains, throw not away your watering pot.", AndroidShare.TEXT, null);
            }
        });
        findViewById(R.id.back).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
             finish();
            }
        });
    }

    private void setUpView() {
        webview.loadUrl("file:///android_asset/www/jiazhao/jiazhao.html");
       //設定WebView屬性,能夠執行Javascript指令碼
        mWebSettings = webview.getSettings();
        mWebSettings.setJavaScriptEnabled(true);    //允許載入javascript
        mWebSettings.setSupportZoom(true);          //允許縮放
        mWebSettings.setBuiltInZoomControls(true);  //原網頁基礎上縮放
        mWebSettings.setUseWideViewPort(true);      //任意比例縮放
        webview.setWebViewClient(webClient);  //設定Web檢視
    }

   /***
     * 設定Web檢視的方法
     */
    WebViewClient webClient = new WebViewClient(){//處理網頁載入失敗時
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            showErrorPage();//顯示錯誤頁面
        };

    };

    boolean mIsErrorPage;
    protected void showErrorPage() {
        LinearLayout webParentView = (LinearLayout)webview.getParent();
        initErrorPage();//初始化自定義頁面
        while (webParentView.getChildCount() > 1) {
            webParentView.removeViewAt(0);
        }
        @SuppressWarnings("deprecation")
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewPager.LayoutParams.FILL_PARENT, ViewPager.LayoutParams.FILL_PARENT);
        webParentView.addView(mErrorView, 0, lp);
        mIsErrorPage = true;
    }
    /****
     * 把系統自身請求失敗時的網頁隱藏
     */
    protected void hideErrorPage() {
        LinearLayout webParentView = (LinearLayout)webview.getParent();
        mIsErrorPage = false;
        while (webParentView.getChildCount() > 1) {
            webParentView.removeViewAt(0);
        }
    }
    /***
     * 顯示載入失敗時自定義的網頁
     */
    protected void initErrorPage() {
        if (mErrorView == null) {
            mErrorView = View.inflate(this, R.layout.activity_error, null);
            RelativeLayout layout = (RelativeLayout)mErrorView.findViewById(R.id.online_error_btn_retry);
            layout.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    webview.reload();
                }
            });
            mErrorView.setOnClickListener(null);
        }
    }
}

緊接著是科目一,和科目四,他們的佈局採用的是LinearLayout+GridLayout

這裡寫圖片描述

*順序練習,隨機練習,章節練習,專項練習的資料繫結基本上是差不多的,像順序練習的查詢語句“SELECT FROM +表名”隨機練習的查詢語句“SELECT * FROM +表名 + ORDER BY random()”章節練習和專項練習的查詢語句“ SELECT * FROM web_note where +列名=值 ”
開始答題,答題頁面採用的 ViewPager+Frament,碎片裡採用了TextView+RadioGroup+RadioButton+ScrollView**

這裡寫圖片描述

當你答對,RadioButton中setButtonDrawable改變對的圖片,提示你答對,2秒自動跳到下一個碎片裡,首先通過viewpager裡的getCurrentItem()的方法得到當前頁面,再在當前頁面加1,然後採用CountDownTimer實現2秒後自動跳到下一個碎片。當你答錯選中正確答案,選中的RadioButton中setButtonDrawable改變錯的圖片,以及顯示本題解析

這裡寫圖片描述

當點選本題解釋,改變圖片,選中正確答案,顯示本題解析,當再次點選又還原以前的圖片
這裡寫圖片描述

**當點選收藏,改變圖片,獲取當前碎片,得到當前碎片物件,通過修改語句修改某一列的值,比如收藏列沒收藏前值為1,收藏後改變值為2,當再次點選還原以前的圖修改資料庫的值
當點選頁碼上面的圖時,檢視答題情況,答對的顯示綠色,答錯的顯示紅色,不答不改變,顯示所有題號,是通過獲得題目碎片的長度,將值通過Intent傳到下一個activity中,通過for迴圈便利 GridView,在將 GridView加到佈局中,在答題的判斷中,通過map鍵值對的形式,比如在對的判斷中map建是該題號,值為1,錯的判斷中map建同樣是該題號,值為2,activity 中接受碎片的值,通過不同的值加在不同的list集合中,同樣通過Intent傳到下一個activity中,再在GridView的介面卡中進行判斷**

這裡寫圖片描述

**我的錯題和我的收藏同樣是帶條件的查詢,條件後帶的是你修改的那一列
模擬考試和答題有所不同,它就像我們考試一樣,有時間規定,我題數要求,它的樣子如下圖所示:**

這裡寫圖片描述

答題時radioGroup的OnCheckedChangeListener事件中進行判斷,同樣可以通過map來檢視對錯,自定義增加的方法,得到答過幾題,還剩幾題,當時間到,或者點選交卷時,就能得到答了幾題,沒答幾題,以及答對了那些題答錯了那些題

**本次專案總結:
本次專案我發現,寫專案之前必須要有專案的大致輪廓,以及專案的構思,在實現功能前,必須先想清楚實現步驟以及思路。這樣會避免少走很多彎路。
專案中遇到的問題:
使用webview載入靜態網頁時樣式全變了,解決方案:
webview中有一個getSettings的方法,裡面有很多屬性 比如setJavaScriptEnabled(true); //允許載入JavaScript,setSupportZoom(true); //允許縮放setBuiltInZoomControls(true); //原網頁基礎上縮放setUseWideViewPort(true); //任意比例縮放等
在載入網頁前,有個載入的動態效果,系統的UI可能滿足不了,需要自定義UI
Intent不能直接把map集合的值帶到下一個activity,解決方案將map資料新增到封裝的myMap中,在將map放在Bundle中,然後用Intent傳遞。**