首页 » 技术分享 » 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传递。**

转载自原文链接, 如需删除请联系管理员。

原文链接:Android项目仿驾校宝典的答题APP,转载请注明来源!

0