基于Android实现答题倒计时功能

讲一下我在做一个答题APP时涉及到倒计时时遇到的一个问题吧。
碎片(Fragment)+CountDownTimer组成的一个答题,其中遇到的一个问题就是,这个题的倒计时在你手动滑动下一个题的时候却用在了下一个题的时间
解决这个问题运用的就是懒加载来控制倒计时的开始和取消

首先你要先定义一个抽象类继承Fragment 再让你的答题那个碎片的Activity继承

package com.zking.sun.dao;

import android.support.v4.app.Fragment;
import android.util.Log;

/**
 * Created by sun on 2017/1/11.
 */

public abstract class LazyFragment extends Fragment {
  protected boolean isVisible;
  /**
   * 在这里实现Fragment数据的缓加载.
   * @param isVisibleToUser
   */
  @Override
  public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if(getUserVisibleHint()) {
      //可见时调用
      isVisible = true;
      onVisible();
    } else {
      isVisible = false;
      onInvisible();
    }
  }
  protected abstract void onVisible();
  //protected abstract void lazyLoad();
  protected abstract void onInvisible();
}

这是答题的Activity 在这里你要继承刚刚自己写的抽象类
这个类里面包含了数据的加载什么的,有需要的童鞋可以看看,就不删了哈。

package com.zking.sun.android_06_project;

import android.content.Intent;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;

import com.zking.sun.dao.LazyFragment;
import com.zking.sun.dao.QusetionDao;
import com.zking.sun.entity.QuestionEntity;

import java.util.List;

import static com.zking.sun.android_06_project.R.id.tv_splash_01;

/**
 * Created by sun on 2016/12/21.
 */

public class FragmentActivity extends LazyFragment {
  private ViewPager viewpager_main_01;
  private TextView question_fragment_tv;
  private RadioButton answer_fragment_01,answer_fragment_02,answer_fragment_03,answer_fragment_04;
  private QusetionDao qusetionDao=new QusetionDao();
  private int i;
  private RadioGroup rg_fragment_qu;
  private String right_answer;
  private TextView count_fragment_down;
  private int SPLASH_DISPLAY_LENGHT = 10000; //延迟多少秒
  private TextView tv_splash_01;
  private Handler handler = new Handler();
  private Runnable runnbale ;
  private Intent intent;
  private MyCountdownTimer countdowntimer;
  private TextView questionR_fragment_tv;
  private boolean isPrepared;

  public FragmentActivity(){
  }
  public FragmentActivity(int i){
    this.i=i;
  }
  public int getI() {
    return i;
  }
  public void setI(int i) {
    this.i = i;
  }

  @Nullable
  @Override
  public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View v=inflater.inflate(R.layout.fragment_1,null);
    //找到问题和答案的控件
    question_fragment_tv = (TextView) v.findViewById(R.id.question_fragment_tv);
    questionR_fragment_tv = (TextView) v.findViewById(R.id.questionR_fragment_tv);
    questionR_fragment_tv.setVisibility(View.INVISIBLE);
    answer_fragment_01 = (RadioButton) v.findViewById(R.id.answer_fragment_01);
    answer_fragment_02 = (RadioButton) v.findViewById(R.id.answer_fragment_02);
    answer_fragment_03 = (RadioButton) v.findViewById(R.id.answer_fragment_03);
    answer_fragment_04 = (RadioButton) v.findViewById(R.id.answer_fragment_04);
    rg_fragment_qu = (RadioGroup) v.findViewById(R.id.rg_fragment_qu);
    count_fragment_down = (TextView) v.findViewById(R.id.count_fragment_down);
    //倒计时
    countdowntimer = new MyCountdownTimer(10000, 1000);
    //绑定值 获取页面的监听的i 传过来改变
    isPrepared = true;
    //懒加载
    getvalue(this.i);
    onVisible();//可见
    onInvisible();//不可见
    // lazyLoad();

    return v;
  }

  public void getvalue(int i){
    //查询数据
    /**
     * @param context 上下文
     * @param name  名字(数据库名),文件名
     * @param factory 游标工厂,多数情况:null
     * @param version 数据库版本
     */
    //DBHepler dbHepler=new DBHepler(this,"questions.db",null,1);
    List<QuestionEntity> questionEntityList=qusetionDao.findAll(getContext());
    right_answer = questionEntityList.get(i).getRight_answer();
    questionR_fragment_tv.setText("答案:"+right_answer);
    /* if (right_answer.equalsIgnoreCase("A")){
      right_answer = "answer_fragment_01";
    }*/

    //将查询出来的数据放到控件里面
    question_fragment_tv.setText(questionEntityList.get(i).getQusetion());
    answer_fragment_01.setText(questionEntityList.get(i).getAnswera());
    answer_fragment_02.setText(questionEntityList.get(i).getAnswerb());
    answer_fragment_03.setText(questionEntityList.get(i).getAnswerc());

    String this04=questionEntityList.get(i).getAnswerd()+"";
    Log.i("answer_fragment_04","_____________"+this04+"_____________");
    if(this04.equals("")||this04.equals("null")){
      answer_fragment_04.setVisibility(View.INVISIBLE);
    }
    else{
      answer_fragment_04.setText(questionEntityList.get(i).getAnswerd());
      answer_fragment_04.setVisibility(View.VISIBLE);
    }

    //get组设点击事件
    rg_fragment_qu.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
      @Override
      public void onCheckedChanged(RadioGroup group, int checkedId) {
        rg_fragment_qu.setEnabled(false);
        int selectRadio = group.getCheckedRadioButtonId();
        switch (selectRadio){
          case R.id.answer_fragment_01:
            // countdowntimer.cancel();
            if (right_answer.equalsIgnoreCase("A")){
              answer_fragment_01.setBackgroundResource(R.drawable.examtxt_btn_right);
            }
            else{
              answer_fragment_01.setBackgroundResource(R.drawable.examtxt_btn_wrong);
              questionR_fragment_tv.setVisibility(View.VISIBLE);
            }
            answer_fragment_02.setEnabled(false);
            answer_fragment_03.setEnabled(false);
            answer_fragment_04.setEnabled(false);
            break;
          case R.id.answer_fragment_02:
            //countdowntimer.cancel();
            if (right_answer.equalsIgnoreCase("B")){
              answer_fragment_02.setBackgroundResource(R.drawable.examtxt_btn_right);
            }
            else{
              answer_fragment_02.setBackgroundResource(R.drawable.examtxt_btn_wrong);
              questionR_fragment_tv.setVisibility(View.VISIBLE);
            }
            answer_fragment_01.setEnabled(false);
            answer_fragment_03.setEnabled(false);
            answer_fragment_04.setEnabled(false);
            break;
          case R.id.answer_fragment_03:
            //countdowntimer.cancel();
            if (right_answer.equalsIgnoreCase("C")){
              answer_fragment_03.setBackgroundResource(R.drawable.examtxt_btn_right);
            }
            else{
              answer_fragment_03.setBackgroundResource(R.drawable.examtxt_btn_wrong);
              questionR_fragment_tv.setVisibility(View.VISIBLE);
            }
            answer_fragment_02.setEnabled(false);
            answer_fragment_01.setEnabled(false);
            answer_fragment_04.setEnabled(false);
            break;
          case R.id.answer_fragment_04:
            //countdowntimer.cancel();
            if (right_answer.equalsIgnoreCase("D")){
              answer_fragment_04.setBackgroundResource(R.drawable.examtxt_btn_right);
            }
            else{
              answer_fragment_04.setBackgroundResource(R.drawable.examtxt_btn_wrong);
              questionR_fragment_tv.setVisibility(View.VISIBLE);
            }
            answer_fragment_02.setEnabled(false);
            answer_fragment_03.setEnabled(false);
            answer_fragment_01.setEnabled(false);
            break;
        }

      }
    });
  }

  /**
   * Rewrite 'CountDownTimer' method.
   *
   * @param
   *      // 倒计时总数,单位为毫秒。
   * @param
   *      // 每隔多久调用onTick一次
   * @author DaiZhenWei
   *
   */
    protected class MyCountdownTimer extends CountDownTimer {

      public MyCountdownTimer(long millisInFuture, long countDownInterval) {
        super(millisInFuture, countDownInterval);
      }
      @Override
      public void onTick(long millisUntilFinished) {
        count_fragment_down.setText("倒计时: " + millisUntilFinished / 1000);
      }
      @Override
      public void onFinish() {
        //count_fragment_down.setText("Turning");
        FightActivity.getNext(null);
      }
    }

  //fragment的懒加载 重写
  @Override
  protected void onVisible() {
    //可见的
    if(!isPrepared || !isVisible) {
      //判断isPrepared和isVisible只要有一个不为true就不往下执行
      Log.i("isPrepared",isPrepared+"____________"+isVisible);
      return;
    }
    /**
     * 倒计时
     */
    countdowntimer.start();//开始倒计时
    Log.i("isPrepared",this.i+"_______4");
  }
  @Override
  protected void onInvisible() {
    //不可见的
    if(!isPrepared || isVisible) {
      return;
    }
    Log.i("isPrepared","____________我取消了"+this.i);
    countdowntimer.cancel();//将倒计时取消

  }
/*
   //主页面
  public void loadUI(Class c){
    //启动之后跳著页面
//    Intent intent=new Intent(SplashActivity.this,MainActivity.class);
    Intent intent=new Intent(FragmentActivity.this.getContext(),c);
//    SplashActivity.this.startActivity(intent);
//    SplashActivity.this.finish();//Toast.LENGTH_LONG
  }
*/

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • android实现倒计时功能代码
  • android自定义倒计时控件示例
  • Android实现加载广告图片和倒计时的开屏布局
  • Android实现计时与倒计时的常用方法小结
  • Android 实现闪屏页和右上角的倒计时跳转实例代码
  • Android通过手势实现答题器翻页效果
  • Android账号注册实现点击获取验证码倒计时效果
  • Android中使用TextView实现高仿京东淘宝各种倒计时效果
  • Android答题APP的设计与实现
  • Android实现简单的答题系统
  • Android APP编写简单答题器
(0)

相关推荐

  • Android实现加载广告图片和倒计时的开屏布局

    这是一个android开屏布局的实例,可以用于加载广告图片和倒计时的布局.程序中设置的LayoutParams,划分额外空间比例为6分之5,具体权重比例可根据用户自己需求来自定义,异步加载广告图片,相关的Android代码. 具体实现代码如下: package cn.waps.extend; import android.app.Activity; import android.content.Context; import android.content.res.Configuration;

  • Android 实现闪屏页和右上角的倒计时跳转实例代码

    以前编程的时候,遇到倒计时的功能时,经常自己去写,但其实Android已经帮封装好了一个倒计时类CountDownTimer,其实是将后台线程的创建和Handler队列封装成为了一个方便的类调用. 闪屏页用到了handler和CountDownTimer类,还需配置一下Activity的主题,这里是:android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 全屏主题的意思. 给大家展示下效果图: 代码如下所示: package

  • Android实现简单的答题系统

    本文实例为大家分享了Android实现答题系统的具体代码,供大家参考,具体内容如下 Question: package com.example.lenovo.exam; /** * Created by lenovo on 2017/12/4. */ //保存从数据库中读取的记录 public class Question { public String question; public String answerA; public String answerB; public String a

  • Android账号注册实现点击获取验证码倒计时效果

    网站中为了防止恶意获取验证短信.验证邮箱,都会在点击获取验证码的按钮上做个倒计时的效果,如何实现这个效果,具体内容如下 效果图:   代码: RegisterActivity.java import android.os.Bundle; import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.Button; import com.jialianjia.bzw.BaseAct

  • Android实现计时与倒计时的常用方法小结

    本文实例总结了Android实现计时与倒计时的常用方法.分享给大家供大家参考,具体如下: 方法一 Timer与TimerTask(Java实现) public class timerTask extends Activity{ private int recLen = 11; private TextView txtView; Timer timer = new Timer(); public void onCreate(Bundle savedInstanceState){ super.onC

  • android实现倒计时功能代码

    效果图,每隔1秒,变换一下时间  xml: 复制代码 代码如下: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="mat

  • Android通过手势实现答题器翻页效果

    本文实例为大家分享了Android答题器翻页功能,主要使用ViewFilpper和GestureDetector来实现,供大家参考,具体内容如下 1.效果图 2.实现思路 把Activity的TouchEvent事件交个GestureDetector来处理,然后使用ViewFilpper使用动画控制多个组件的之间的切换效果.手势的一个Api就不详细说了,大家如果不了解可以查一下. 3.实现的步骤 1).构建手势检测器 2).准备数据 3).为ViewFilpper添加子控件. 4).初始化Ani

  • Android中使用TextView实现高仿京东淘宝各种倒计时效果

    今天给大家带来的是仅仅使用一个TextView实现一个高仿京东.淘宝.唯品会等各种电商APP的活动倒计时.最近公司一直加班也没来得及时间去整理,今天难得休息想把这个分享给大家,只求共同学习,以及自己后续的复习.为什么会想到使用一个TextView来实现呢?因为最近公司在做一些优化的工作,其中就有一个倒计时样式,原来开发的这个控件的同事使用了多个TextView拼接在一起的,实现的代码冗余比较大,故此项目经理就说:小宏这个就交给你来优化了,并且还要保证有一定的扩展性,当时就懵逼了.不知道从何处开始

  • Android答题APP的设计与实现

    还没有整理完,待续-- 学校开了Android课,最后让交一个大作业.正好拿来练练手,记录下思路.也希望能给有需要的朋友们一些帮助.恩,纯小白教程,大神们可以绕路了. 作业的题目是这样的: 考试APP系统: 1)要求有用户登陆功能:从远程服务器进行登陆验证. 2)要有考试测试界面,主要是选择.判断.简答题目测试. 3)要有统计成绩界面和错题显示界面. 评分标准: 1.界面设计占评分的30% 2.系统运行正确; 功能完善:工作量充分: 系统实现有一定的技术的难度.50% 3.要求有适当的系统主要模

  • android自定义倒计时控件示例

    自定义TextView控件TimeTextView代码: 复制代码 代码如下: import android.content.Context;import android.content.res.TypedArray;import android.graphics.Paint;import android.text.Html;import android.util.AttributeSet;import android.widget.TextView; import com.new0315.R;

  • Android APP编写简单答题器

    本文为大家分享了Android APP编写的简单答题器,此答题器可以通过Next按钮选择下一题,新写题目的类Question,有两个成员变量. java代码: package com.android.testrecord; /** * Created by wang on 16-10-19. */ public class Question { private int mTextResId; private boolean mAnswerTrue; public Question(int tex

随机推荐