[embedyt] https://www.youtube.com/watch?v=bLUXfWkZMD8[/embedyt]
QuizActivity.javaQuizDbHelper.javaQuestion.javaQuizContract.javacolors.xmlactivity_starting_screen.xmlactivity_quiz.xmlStartingScreenActivity.java
package com.codinginflow.myawesomequiz; import android.content.Intent; import android.content.res.ColorStateList; import android.graphics.Color; import android.os.CountDownTimer; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.TextView; import android.widget.Toast; import java.util.Collections; import java.util.List; import java.util.Locale; public class QuizActivity extends AppCompatActivity { public static final String EXTRA_SCORE = "extraScore"; private static final long COUNTDOWN_IN_MILLIS = 30000; private TextView textViewQuestion; private TextView textViewScore; private TextView textViewQuestionCount; private TextView textViewCountDown; private RadioGroup rbGroup; private RadioButton rb1; private RadioButton rb2; private RadioButton rb3; private Button buttonConfirmNext; private ColorStateList textColorDefaultRb; private ColorStateList textColorDefaultCd; private CountDownTimer countDownTimer; private long timeLeftInMillis; private List<Question> questionList; private int questionCounter; private int questionCountTotal; private Question currentQuestion; private int score; private boolean answered; private long backPressedTime; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_quiz); textViewQuestion = findViewById(R.id.text_view_question); textViewScore = findViewById(R.id.text_view_score); textViewQuestionCount = findViewById(R.id.text_view_question_count); textViewCountDown = findViewById(R.id.text_view_countdown); rbGroup = findViewById(R.id.radio_group); rb1 = findViewById(R.id.radio_button1); rb2 = findViewById(R.id.radio_button2); rb3 = findViewById(R.id.radio_button3); buttonConfirmNext = findViewById(R.id.button_confirm_next); textColorDefaultRb = rb1.getTextColors(); textColorDefaultCd = textViewCountDown.getTextColors(); QuizDbHelper dbHelper = new QuizDbHelper(this); questionList = dbHelper.getAllQuestions(); questionCountTotal = questionList.size(); Collections.shuffle(questionList); showNextQuestion(); buttonConfirmNext.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (!answered) { if (rb1.isChecked() || rb2.isChecked() || rb3.isChecked()) { checkAnswer(); } else { Toast.makeText(QuizActivity.this, "Please select an answer", Toast.LENGTH_SHORT).show(); } } else { showNextQuestion(); } } }); } private void showNextQuestion() { rb1.setTextColor(textColorDefaultRb); rb2.setTextColor(textColorDefaultRb); rb3.setTextColor(textColorDefaultRb); rbGroup.clearCheck(); if (questionCounter < questionCountTotal) { currentQuestion = questionList.get(questionCounter); textViewQuestion.setText(currentQuestion.getQuestion()); rb1.setText(currentQuestion.getOption1()); rb2.setText(currentQuestion.getOption2()); rb3.setText(currentQuestion.getOption3()); questionCounter++; textViewQuestionCount.setText("Question: " + questionCounter + "/" + questionCountTotal); answered = false; buttonConfirmNext.setText("Confirm"); timeLeftInMillis = COUNTDOWN_IN_MILLIS; startCountDown(); } else { finishQuiz(); } } private void startCountDown() { countDownTimer = new CountDownTimer(timeLeftInMillis, 1000) { @Override public void onTick(long millisUntilFinished) { timeLeftInMillis = millisUntilFinished; updateCountDownText(); } @Override public void onFinish() { timeLeftInMillis = 0; updateCountDownText(); checkAnswer(); } }.start(); } private void updateCountDownText() { int minutes = (int) (timeLeftInMillis / 1000) / 60; int seconds = (int) (timeLeftInMillis / 1000) % 60; String timeFormatted = String.format(Locale.getDefault(), "%02d:%02d", minutes, seconds); textViewCountDown.setText(timeFormatted); if (timeLeftInMillis < 10000) { textViewCountDown.setTextColor(Color.RED); } else { textViewCountDown.setTextColor(textColorDefaultCd); } } private void checkAnswer() { answered = true; countDownTimer.cancel(); RadioButton rbSelected = findViewById(rbGroup.getCheckedRadioButtonId()); int answerNr = rbGroup.indexOfChild(rbSelected) + 1; if (answerNr == currentQuestion.getAnswerNr()) { score++; textViewScore.setText("Score: " + score); } showSolution(); } private void showSolution() { rb1.setTextColor(Color.RED); rb2.setTextColor(Color.RED); rb3.setTextColor(Color.RED); switch (currentQuestion.getAnswerNr()) { case 1: rb1.setTextColor(Color.GREEN); textViewQuestion.setText("Answer 1 is correct"); break; case 2: rb2.setTextColor(Color.GREEN); textViewQuestion.setText("Answer 2 is correct"); break; case 3: rb3.setTextColor(Color.GREEN); textViewQuestion.setText("Answer 3 is correct"); break; } if (questionCounter < questionCountTotal) { buttonConfirmNext.setText("Next"); } else { buttonConfirmNext.setText("Finish"); } } private void finishQuiz() { Intent resultIntent = new Intent(); resultIntent.putExtra(EXTRA_SCORE, score); setResult(RESULT_OK, resultIntent); finish(); } @Override public void onBackPressed() { if (backPressedTime + 2000 > System.currentTimeMillis()) { finishQuiz(); } else { Toast.makeText(this, "Press back again to finish", Toast.LENGTH_SHORT).show(); } backPressedTime = System.currentTimeMillis(); } @Override protected void onDestroy() { super.onDestroy(); if (countDownTimer != null) { countDownTimer.cancel(); } } }
package com.codinginflow.myawesomequiz; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import com.codinginflow.myawesomequiz.QuizContract.*; import java.util.ArrayList; import java.util.List; public class QuizDbHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "MyAwesomeQuiz.db"; private static final int DATABASE_VERSION = 1; private SQLiteDatabase db; public QuizDbHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { this.db = db; final String SQL_CREATE_QUESTIONS_TABLE = "CREATE TABLE " + QuestionsTable.TABLE_NAME + " ( " + QuestionsTable._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + QuestionsTable.COLUMN_QUESTION + " TEXT, " + QuestionsTable.COLUMN_OPTION1 + " TEXT, " + QuestionsTable.COLUMN_OPTION2 + " TEXT, " + QuestionsTable.COLUMN_OPTION3 + " TEXT, " + QuestionsTable.COLUMN_ANSWER_NR + " INTEGER" + ")"; db.execSQL(SQL_CREATE_QUESTIONS_TABLE); fillQuestionsTable(); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + QuestionsTable.TABLE_NAME); onCreate(db); } private void fillQuestionsTable() { Question q1 = new Question("A is correct", "A", "B", "C", 1); addQuestion(q1); Question q2 = new Question("B is correct", "A", "B", "C", 2); addQuestion(q2); Question q3 = new Question("C is correct", "A", "B", "C", 3); addQuestion(q3); Question q4 = new Question("A is correct again", "A", "B", "C", 1); addQuestion(q4); Question q5 = new Question("B is correct again", "A", "B", "C", 2); addQuestion(q5); } private void addQuestion(Question question) { ContentValues cv = new ContentValues(); cv.put(QuestionsTable.COLUMN_QUESTION, question.getQuestion()); cv.put(QuestionsTable.COLUMN_OPTION1, question.getOption1()); cv.put(QuestionsTable.COLUMN_OPTION2, question.getOption2()); cv.put(QuestionsTable.COLUMN_OPTION3, question.getOption3()); cv.put(QuestionsTable.COLUMN_ANSWER_NR, question.getAnswerNr()); db.insert(QuestionsTable.TABLE_NAME, null, cv); } public List<Question> getAllQuestions() { List<Question> questionList = new ArrayList<>(); db = getReadableDatabase(); Cursor c = db.rawQuery("SELECT * FROM " + QuestionsTable.TABLE_NAME, null); if (c.moveToFirst()) { do { Question question = new Question(); question.setQuestion(c.getString(c.getColumnIndex(QuestionsTable.COLUMN_QUESTION))); question.setOption1(c.getString(c.getColumnIndex(QuestionsTable.COLUMN_OPTION1))); question.setOption2(c.getString(c.getColumnIndex(QuestionsTable.COLUMN_OPTION2))); question.setOption3(c.getString(c.getColumnIndex(QuestionsTable.COLUMN_OPTION3))); question.setAnswerNr(c.getInt(c.getColumnIndex(QuestionsTable.COLUMN_ANSWER_NR))); questionList.add(question); } while (c.moveToNext()); } c.close(); return questionList; } }
package com.codinginflow.myawesomequiz; public class Question { private String question; private String option1; private String option2; private String option3; private int answerNr; public Question() { } public Question(String question, String option1, String option2, String option3, int answerNr) { this.question = question; this.option1 = option1; this.option2 = option2; this.option3 = option3; this.answerNr = answerNr; } public String getQuestion() { return question; } public void setQuestion(String question) { this.question = question; } public String getOption1() { return option1; } public void setOption1(String option1) { this.option1 = option1; } public String getOption2() { return option2; } public void setOption2(String option2) { this.option2 = option2; } public String getOption3() { return option3; } public void setOption3(String option3) { this.option3 = option3; } public int getAnswerNr() { return answerNr; } public void setAnswerNr(int answerNr) { this.answerNr = answerNr; } }
package com.codinginflow.myawesomequiz; import android.provider.BaseColumns; public final class QuizContract { private QuizContract() { } public static class QuestionsTable implements BaseColumns { public static final String TABLE_NAME = "quiz_questions"; public static final String COLUMN_QUESTION = "question"; public static final String COLUMN_OPTION1 = "option1"; public static final String COLUMN_OPTION2 = "option2"; public static final String COLUMN_OPTION3 = "option3"; public static final String COLUMN_ANSWER_NR = "answer_nr"; } }
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="colorPrimary">#795548</color> <color name="colorPrimaryDark">#5D4037</color> <color name="colorAccent">#FFEB3B</color> <color name="colorBackground">#BCAAA4</color> </resources>
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/colorBackground" android:padding="16dp" tools:context="com.codinginflow.myawesomequiz.StartingScreenActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_marginTop="30dp" android:text="My Awesome Quiz" android:textColor="@android:color/black" android:textSize="35sp" /> <TextView android:id="@+id/text_view_highscore" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@id/button_start_quiz" android:layout_centerHorizontal="true" android:layout_marginBottom="32dp" android:text="Highscore: 0" android:textSize="20sp" /> <Button android:id="@+id/button_start_quiz" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="Start Quiz" /> </RelativeLayout>
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/colorBackground" android:padding="16dp" tools:context="com.codinginflow.myawesomequiz.QuizActivity"> <TextView android:id="@+id/text_view_score" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Score: 0" android:textColor="@android:color/black" /> <TextView android:id="@+id/text_view_question_count" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/text_view_score" android:text="Question: 1/x" android:textColor="@android:color/black" /> <TextView android:id="@+id/text_view_countdown" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" android:text="00:30" android:textColor="@android:color/black" android:textSize="40sp" /> <TextView android:id="@+id/text_view_question" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_above="@id/radio_group" android:layout_marginBottom="16dp" android:text="Here will be the question text\nHere will be the question text\nHere will be the question text" android:textAlignment="center" android:textColor="@android:color/black" android:textSize="20sp" /> <RadioGroup android:id="@+id/radio_group" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true"> <RadioButton android:id="@+id/radio_button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Option 1" /> <RadioButton android:id="@+id/radio_button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Option 2" /> <RadioButton android:id="@+id/radio_button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Option 3" /> </RadioGroup> <Button android:id="@+id/button_confirm_next" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/radio_group" android:layout_marginTop="16dp" android:text="Confirm" /> </RelativeLayout>
package com.codinginflow.myawesomequiz; import android.content.Intent; import android.content.SharedPreferences; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; public class StartingScreenActivity extends AppCompatActivity { private static final int REQUEST_CODE_QUIZ = 1; public static final String SHARED_PREFS = "sharedPrefs"; public static final String KEY_HIGHSCORE = "keyHighscore"; private TextView textViewHighscore; private int highscore; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_starting_screen); textViewHighscore = findViewById(R.id.text_view_highscore); loadHighscore(); Button buttonStartQuiz = findViewById(R.id.button_start_quiz); buttonStartQuiz.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startQuiz(); } }); } private void startQuiz() { Intent intent = new Intent(StartingScreenActivity.this, QuizActivity.class); startActivityForResult(intent, REQUEST_CODE_QUIZ); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_QUIZ) { if (resultCode == RESULT_OK) { int score = data.getIntExtra(QuizActivity.EXTRA_SCORE, 0); if (score > highscore) { updateHighscore(score); } } } } private void loadHighscore() { SharedPreferences prefs = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE); highscore = prefs.getInt(KEY_HIGHSCORE, 0); textViewHighscore.setText("Highscore: " + highscore); } private void updateHighscore(int highscoreNew) { highscore = highscoreNew; textViewHighscore.setText("Highscore: " + highscore); SharedPreferences prefs = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE); SharedPreferences.Editor editor = prefs.edit(); editor.putInt(KEY_HIGHSCORE, highscore); editor.apply(); } }