I am working on Timer. I have created a TextView in my Question XML(Where I have to Implement Timer to display) and PlayButton in Welcome XML (Timer in Question Activity Start When Play button Is Clicked) .I have WelcomeActivity where I have implemented PlayButton and QuestionActivity Where I wanted to Function my timer.I am attaching My Code Here:-
Welcome XML:-
<Button
android:text="Play"
android:id="#+id/playBtn"
android:layout_width="80dip"
android:layout_alignParentRight="true"
android:layout_height="wrap_content"
android:paddingTop="5dip"
android:paddingBottom="5dip"
android:textColor="#ffffff"
android:background="#drawable/start_button" />
Question XML:-
<TextView
android:id="#+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="#+id/question"
android:layout_centerHorizontal="true"
android:background="#drawable/timer_bttn"
android:onClick="onClick"/>
Welcome Activity:-
public class WelcomeActivity extends Activity implements OnClickListener{
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.welcome);
//////////////////////////////////////////////////////////////////////
//////// GAME MENU /////////////////////////////////////////////////
Button playBtn = (Button) findViewById(R.id.playBtn);
playBtn.setOnClickListener(this);
Button settingsBtn = (Button) findViewById(R.id.settingsBtn);
settingsBtn.setOnClickListener(this);
Button rulesBtn = (Button) findViewById(R.id.rulesBtn);
rulesBtn.setOnClickListener(this);
Button exitBtn = (Button) findViewById(R.id.exitBtn);
exitBtn.setOnClickListener(this);
}
/**
* Listener for game menu
*/
#Override
public void onClick(View v) {
Intent i;
switch (v.getId()){
case R.id.playBtn :
//once logged in, load the main page
//Log.d("LOGIN", "User has started the game");
//Get Question set //
List<Question> questions = getQuestionSetFromDb();
//Initialise Game with retrieved question set ///
GamePlay c = new GamePlay();
c.setQuestions(questions);
c.setNumRounds(getNumQuestions());
((CYKApplication)getApplication()).setCurrentGame(c);
//Start Game Now.. //
i = new Intent(this, QuestionActivity.class);
startActivityForResult(i, Constants.PLAYBUTTON);
break;
case R.id.rulesBtn :
i = new Intent(this, RulesActivity.class);
startActivityForResult(i, Constants.RULESBUTTON);
break;
case R.id.settingsBtn :
i = new Intent(this, SettingsActivity.class);
startActivityForResult(i, Constants.SETTINGSBUTTON);
break;
case R.id.exitBtn :
finish();
break;
}
}
QuestionActivity:-
public class QuestionActivity extends Activity implements OnClickListener{
private Question currentQ;
private GamePlay currentGame;
protected TextView txtTimer;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.question);
/**
* Configure current game and get question
*/
currentGame = ((CYKApplication)getApplication()).getCurrentGame();
currentQ = currentGame.getNextQuestion();
Button nextBtn1 = (Button) findViewById(R.id.answer1);
nextBtn1.setOnClickListener(this);
Button nextBtn2 = (Button) findViewById(R.id.answer2);
nextBtn2.setOnClickListener(this);
Button nextBtn3 = (Button) findViewById(R.id.answer3);
nextBtn3.setOnClickListener(this);
Button nextBtn4 = (Button) findViewById(R.id.answer4);
nextBtn4.setOnClickListener(this);
/**
* Update the question and answer options..
*/
setQuestions();
}
/**
* Method to set the text for the question and answers from the current games
* current question
*/
private void setQuestions() {
//set the question text from current question
String question = Utility.capitalise(currentQ.getQuestion());
TextView qText = (TextView) findViewById(R.id.question);
qText.setText(question);
//set the available options
List<String> answers = currentQ.getQuestionOptions();
TextView option1 = (TextView) findViewById(R.id.answer1);
option1.setText(Utility.capitalise(answers.get(0)));
TextView option2 = (TextView) findViewById(R.id.answer2);
option2.setText(Utility.capitalise(answers.get(1)));
TextView option3 = (TextView) findViewById(R.id.answer3);
option3.setText(Utility.capitalise(answers.get(2)));
TextView option4 = (TextView) findViewById(R.id.answer4);
option4.setText(Utility.capitalise(answers.get(3)));
}
#Override
public void onClick(View arg0) {
//Log.d("Questions", "Moving to next question");
setTimer();
/**
* check if end of game
*/
if (currentGame.isGameOver()){
//Log.d("Questions", "End of game! lets add up the scores..");
//Log.d("Questions", "Questions Correct: " + currentGame.getRight());
//Log.d("Questions", "Questions Wrong: " + currentGame.getWrong());
Intent i = new Intent(this, EndgameActivity.class);
startActivity(i);
finish();
}
else{
Intent i = new Intent(this, QuestionActivity.class);
startActivity(i);
finish();
}
}
#Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
switch (keyCode)
{
case KeyEvent.KEYCODE_BACK :
return true;
}
return super.onKeyDown(keyCode, event);
}
/**
* Check if a checkbox has been selected, and if it
* has then check if its correct and update gamescore
*/
private boolean checkAnswer() {
String answer = getSelectedAnswer();
if (answer==null){
//Log.d("Questions", "No Checkbox selection made - returning");
return false;
}
else {
//Log.d("Questions", "Valid Checkbox selection made - check if correct");
if (currentQ.getAnswer().equalsIgnoreCase(answer))
{
//Log.d("Questions", "Correct Answer!");
currentGame.incrementScore();
}
else{
//Log.d("Questions", "Incorrect Answer!");
currentGame.decrementScore();
}
return true;
}
}
/**
*
*/
private String getSelectedAnswer() {
Button c1 = (Button)findViewById(R.id.answer1);
Button c2 = (Button)findViewById(R.id.answer2);
Button c3 = (Button)findViewById(R.id.answer3);
Button c4 = (Button)findViewById(R.id.answer4);
if (c1.callOnClick())
{
return c1.getContext().toString();
}
if (c2.callOnClick())
{
return c2.getContext().toString();
}
if (c3.callOnClick())
{
return c3.getContext().toString();
}
if (c4.callOnClick())
{
return c4.getContext().toString();
}
return null;
}
public void setTimer() {
long finishTime = 5;
CountDownTimer counterTimer = new CountDownTimer(finishTime * 1000, 1000) {
public void onFinish() {
//code to execute when time finished
}
public void onTick(long millisUntilFinished) {
int seconds = (int) (millisUntilFinished / 1000);
int minutes = seconds / 60;
seconds = seconds % 60;
if (seconds < 10) {
txtTimer.setText("" + minutes + ":0" + seconds);
} else {
txtTimer.setText("" + minutes + ":" + seconds);
}
}
};
counterTimer.start();
}
}
I am trying To add A function in QuestionActivity But I don't know how to proceed to call my timer One activity to another Activity. so that my timer display on Question XMl after Clicking the Play Button In Welcome XMl.Can anyone help me How to add listener in another activity Or some other way to solve My Problem.
thank's in Advance
why would you start the timer when the button is clicked?
you can set the button to go to the next activity and start the timer on that activity when
it is called...
(sorry this is what i understand with your question: you want the timer to start when the button is clicked and the timer is on another activity?)
Related
I tried to build my app, and this error message was produced.
Unexpected character '=' (code 61) (expected a name start character)
at [row,col {unknown-source}]: [41,21]
I have cleaned my code and tried to clean my code and inspected my code and i can't find anything wrong my code, and help would be gratefully recieved.
This is my MainActivity.
package com.michaeldoughty.android.football_quiz;
import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import
androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.*;
import java.text.DecimalFormat;
public class MainActivity extends AppCompatActivity
{
// to answer true for the question
private Button mTrueButton;
// to answer false for the question
private Button mFalseButton;
// to get the next question
private ImageButton mNextButton;
// to cheat
private Button mCheatButton;
// to hold the questions
private TextView mQuestionTextView;
// whether the user is a cheater
private boolean mIsCheater;
// a key used for the onSaveInstanceState
private final String KEY_INDEX = "index";
// An ActivityResultLauncher for the CheatActivity
ActivityResultLauncher<Intent> cheatActivityResultLauncher =
registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
new ActivityResultCallback<ActivityResult>()
{
#Override
public void onActivityResult (ActivityResult
result)
{
//checking if there is a result code from the
returned intent
if (result.getResultCode () == RESULT_OK)
{
// to check is there is any data in the
returned intent
if (result.getData() == null)
{
return;
}
// setting that the user is a cheater
mIsCheater = true;
}
}
});
// an array of Question objects
private Question [] mQuestionBank = new Question []
{
new Question (R.string.question_euro, true),
new Question (R.string.question_world_cup, false),
new Question (R.string.question_premier_league,
false),
new Question (R.string.question_england, true),
new Question (R.string.question_fa_cup, false),
new Question (R.string.question_league_cup, true)
};
// the index of the current question being displayed
private int mCurrentIndex = 0;
// to hold the percentage of correct answers
private double percentage = 0;
// to hold the amount of correct answers
private double correct = 0;
#Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// to check if there is a value of mCurrentIndex in the
savedInstanceState
if (savedInstanceState != null)
{
mCurrentIndex = savedInstanceState.getInt (KEY_INDEX,
0);
}
// to create the mQuestionTextView
mQuestionTextView = (TextView) findViewById
(R.id.question_text_view);
mQuestionTextView.setOnClickListener(new
View.OnClickListener()
{
#Override
public void onClick(View view)
{
// update the mCurrrentIndex
mCurrentIndex++;
// enable the mTrueButton and mFalseButton
mTrueButton.setEnabled (true);
mFalseButton.setEnabled (true);
if (mCurrentIndex < 6)
{
// call the updateQuestion method
updateQuestion();
}
else
{
displayPercentage ();
mCurrentIndex = 0;
updateQuestion();
}
}
});
// call the updateQuestion method
updateQuestion ();
// to create the mTrueButton
mTrueButton = (Button) findViewById (R.id.true_button);
mTrueButton.setOnClickListener(new View.OnClickListener()
{
#Override
public void onClick(View view)
{
// call the checkAnswer method
checkAnswer (true);
// disable the mTrueButton and mFalseButton
mTrueButton.setEnabled (false);
mFalseButton.setEnabled (false);
}
});
// to create the mFalseButton
mFalseButton = (Button) findViewById (R.id.false_button);
mFalseButton.setOnClickListener(new View.OnClickListener()
{
#Override
public void onClick(View view)
{
// call the checkAnswer method
checkAnswer (false);
// disable the mTrueButton and mFalseButton
mTrueButton.setEnabled (false);
mFalseButton.setEnabled (false);
}
});
// to create the mNextButton
mNextButton = (ImageButton) findViewById
(R.id.next_button);
mNextButton.setOnClickListener(new View.OnClickListener()
{
#Override
public void onClick(View view)
{
// update the mCurrrentIndex
mCurrentIndex++;
// enable the mTrueButton and mFalseButton
mTrueButton.setEnabled (true);
mFalseButton.setEnabled (true);
if (mCurrentIndex < 6)
{
// call the updateQuestion method
updateQuestion();
}
else
{
displayPercentage ();
mCurrentIndex = 0;
updateQuestion();
}
}
});
// to create the mCheatButton
mCheatButton = (Button) findViewById (R.id.cheat_button);
mCheatButton.setOnClickListener(new View.OnClickListener()
{
#Override
public void onClick(View view)
{
boolean answerIsTrue = mQuestionBank
[mCurrentIndex].isAnswerTrue ();
Intent intent = CheatActivity.newIntent
(MainActivity.this, answerIsTrue);
cheatActivityResultLauncher.launch (intent);
}
});
}
/**
The onSaveInstanceState method saves savedInstanceState when
the activity is stopped.
#param savedInstanceState, the bundle of the activity.
*/
#Override
public void onSaveInstanceState (Bundle savedInstanceState)
{
// call the super's constructor
super.onSaveInstanceState (savedInstanceState);
// to add the mCurrentIndex to the bundle
savedInstanceState.putInt (KEY_INDEX, mCurrentIndex);
}
/**
The updateQuestion method updates the question.
*/
public void updateQuestion ()
{
// get the next question
int question = mQuestionBank [mCurrentIndex].getTextResId
();
// to display the next question
mQuestionTextView.setText (question);
}
/**
The checkAnswer method checks the user's answer, to see if
its correct or not
#param userPressedTrue, the user's answer.
*/
public void checkAnswer (boolean userPressedTrue)
{
// getting the correct answer
boolean answerIsTrue = mQuestionBank
[mCurrentIndex].isAnswerTrue ();
// the message in the toast
int messageResId = 0;
// checking the user's answer and setting the right meassge
if (userPressedTrue == answerIsTrue)
{
messageResId = R.string.correct_toast;
correct++;
}
else
{
messageResId = R.string.incorrect_toast;
}
// displaying the meessage in a toast
Toast toast;
toast = Toast.makeText(this, messageResId,
Toast.LENGTH_SHORT);
toast.setGravity (Gravity.TOP|Gravity.CENTER, 0, 0);
toast.show ();
}
/**
The displayPercentage displays the percentage of correct
answers the user had guessed.
*/
public void displayPercentage ()
{
// working out the percentage
percentage = (correct / mQuestionBank.length) * 100;
DecimalFormat df = new DecimalFormat("#.00");
// displaying the percentage as a toast
Toast.makeText(this, "You have guessed " +
df.format(percentage) + "%!", Toast.LENGTH_SHORT).show ();
// to set the correct and percentage back to zero
correct = 0;
percentage = 0;
}
}
Here is my CheatActivity
// an extra key for the intent which tells the CheatActivity
what the answer is
private static final String EXTRA_ANSWER_IS_TRUE =
"com.michaeldoughty.android.football_quiz_answer_is_true";
// an extra key for the intent which tells the MainActivity if
the user has cheated
private static final String EXTRA_ANSWER_IS_SHOWN =
"com.michaeldoughty.android.football_quiz_answer_shown";
// if the answer is true or not
private boolean mAnswerIsTrue;
// to hold the correct answer
private TextView mAnswerTextView;
// a button to show the correct answer
private Button mShowAnswerButton;
// to create an intent to create a CheatActivity
public static Intent newIntent (Context packageContext,
boolean answerIsTrue)
{
Intent intent = new Intent (packageContext,
CheatActivity.class);
intent.putExtra(EXTRA_ANSWER_IS_TRUE, answerIsTrue);
return intent;
}
public static boolean wasAnswerShown (Intent result)
{
return result.getBooleanExtra (EXTRA_ANSWER_IS_SHOWN,
false);
}
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cheat);
// to get the mAnswerIsTrue
mAnswerIsTrue = getIntent ().getBooleanExtra
(EXTRA_ANSWER_IS_TRUE, false);
// to create the mAnswerTextView
mAnswerTextView = findViewById (R.id.answer_text_view);
// to create the mShowAnswerButton
mShowAnswerButton = findViewById (R.id.show_answer_button);
mShowAnswerButton.setOnClickListener(new
View.OnClickListener()
{
#Override
public void onClick(View view)
{
if (mAnswerIsTrue)
{
mAnswerTextView.setText (R.string.true_button);
}
else
{
mAnswerTextView.setText
(R.string.false_button);
}
setAnswerShownResult (true);
}
});
}
/**
The setAnswerShownResult creates an Intent, to send the
isAnswerShown to the MainActivity.
#param isAnswerShown, whether the user has cheated or not.
*/
private void setAnswerShownResult (boolean isAnswerShown)
{
Intent data = new Intent ();
data.putExtra (EXTRA_ANSWER_IS_SHOWN, isAnswerShown);
setResult(RESULT_OK, data);
}
}
Here is my Question class
package com.michaeldoughty.android.football_quiz;
public class Question
{
// to hold the text res id of the question
private int mTextResId;
// to hold if the answer is true or false
private boolean mAnswerTrue;
/**
Constructor
*/
public Question (int textResId, boolean answerTrue)
{
mTextResId = textResId;
mAnswerTrue = answerTrue;
}
public int getTextResId()
{
return mTextResId;
}
public void setTextResId(int textResId)
{
mTextResId = textResId;
}
public boolean isAnswerTrue()
{
return mAnswerTrue;
}
public void setAnswerTrue(boolean answerTrue)
{
mAnswerTrue = answerTrue;
}
}
I'm creating a timer app that utilizes a thread. When I exit the app using the home button the timer is running fine. Usually, when the time is up a dialog is launched that asks the user for some input. This works completely fine if the app is in its onResume() state, however when the app is in its onStop() state the dialog will not launch and an error is thrown.
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
How can I make it so that when the time is up and the app is NOT in the foreground the dialog is still launched. My initial thought was to save the time remaining in the bundle, but the time remaining is changing for every single tick. Then I thought about storing a boolean in the bundle mTimeRunning. However, when the time is up this value must also change. So now I'm drawing a blank. What can I possibly do so that the dialog is launched when the app is not in the foreground?
TimerActivity.java
public class TimerActivity extends AppCompatActivity implements TimeDialogFragment.sendMinutes,
TimeFinishDialogFragment.sendResponse, BreakFinishDialogFragment.userResponse {
// Variable to log activity state
private static final String TAG = "TimerActivity";
private static final boolean DEBUG = true;
// ^^ Variable used to log acitivty state
private Handler mHandler;
private Runnable mRunnable;
//private static final long START_TIME_MILLISECONDS = 600000;
// Below start time is for development purposes only
private static long mStartTime = 10000;
private long mTimeRemaining = mStartTime;
private boolean mTimeRunning;
private boolean mBreakTime = false;
private ProgressBar mTimeBar;
private TextView mTime;
private Button mStartPause;
private Button mSetTime;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_timer);
if(DEBUG) Log.d(TAG, "+ onCreate() +");
mHandler = new Handler();
mTimeBar = findViewById(R.id.time_bar);
mTime = findViewById(R.id.text_view_time);
mStartPause = findViewById(R.id.button_start_pause);
mSetTime = findViewById(R.id.button_set_time);
updateCountDownText();
mTimeBar.setMax((int) mTimeRemaining);
mSetTime.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
//FragmentManager manager = getSupportFragmentManager();
DialogFragment setTime = new TimeDialogFragment();
setTime.show(getFragmentManager(),"SET_TIME_DIALOG");
}
});
mStartPause.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
if(mTimeRunning){
//pauseTimer();
mTimeRunning = false;
mStartPause.setText("Start");
mHandler.removeCallbacks(mRunnable);
}else{
//startTimer();
timer();
}
}
});
}
// Using a handler + anon runnable
private void timer(){
mRunnable = new Runnable() {
#Override
public void run() {
mTimeRunning = true;
mStartPause.setText("Pause");
mTimeRemaining = mTimeRemaining - 1000;
updateCountDownText();
mTimeBar.incrementProgressBy(1000);
if(mTimeRemaining > 0) {
mHandler.postDelayed(this, 1000);
}else{
// if breaktime is false
if(!mBreakTime) {
DialogFragment dialog = new TimeFinishDialogFragment();
dialog.show(getFragmentManager(),"TIME_FINISH_DIALOG");
mTimeRunning = false;
}else{
// launch break time up dialog.
mBreakTime = false;
DialogFragment dialog = new BreakFinishDialogFragment();
dialog.show(getFragmentManager(), "BREAK_FINSIH_DIALOG");
}
}
}
};
mHandler.postDelayed(mRunnable,1000);
}
public void updateCountDownText(){
int min = (int) (mTimeRemaining / 1000) / 60;
int sec = (int) (mTimeRemaining / 1000) % 60;
String formattedString = String.format(Locale.getDefault(), "%02d:%02d", min, sec);
mTime.setText(formattedString);
}
public void setCountDownText(long time){
int min = (int) (time / 1000) / 60;
int sec = (int) (time / 1000) % 60;
String formattedString = String.format(Locale.getDefault(), "%02d:%02d", min, sec);
mTime.setText(formattedString);
}
#Override
public void userTime(int minutes) {
TimerActivity.mStartTime = (minutes * 60) * 1000;
mTimeRemaining = TimerActivity.mStartTime;
mTimeBar.setMax((int) mTimeRemaining);
setCountDownText(mTimeRemaining);
}
#Override
public void sendResponse(int val) {
if(val == -1){
mTimeRemaining = TimerActivity.mStartTime;
mTimeBar.setMax((int) mTimeRemaining);
updateCountDownText();
mTimeBar.setProgress(0);
mStartPause.setText("Start");
}else if(val == 1) {
mBreakTime = true;
mTimeRemaining = 15000;
mTimeBar.setMax((int) mTimeRemaining);
setCountDownText(mTimeRemaining);
mTimeBar.setProgress(0);
mStartPause.setVisibility(View.INVISIBLE);
timer();
}else {
mTimeRemaining = TimerActivity.mStartTime;
mTimeBar.setMax((int) mTimeRemaining);
updateCountDownText();
mTimeBar.setProgress(0);
timer();
}
}
#Override
public void userResponse(int val) {
if(val < 0) {
// user clicked cance
mTimeRemaining = TimerActivity.mStartTime;
mTimeBar.setMax((int) mTimeRemaining);
updateCountDownText();
mTimeBar.setProgress(0);
mStartPause.setText("Start");
}else {
mTimeRemaining = TimerActivity.mStartTime;
mTimeBar.setMax((int) mTimeRemaining);
updateCountDownText();
mTimeBar.setProgress(0);
timer();
}
mStartPause.setVisibility(View.VISIBLE);
}
TimeFinishedDialog.java
public class TimeFinishDialogFragment extends DialogFragment implements View.OnClickListener{
private Button mCancel;
private Button mSkip;
private Button mStartBreak;
private sendResponse mResponse;
interface sendResponse{
void sendResponse(int val);
}
#Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
//return super.onCreateDialog(savedInstanceState);
View view = LayoutInflater.from(getActivity()).inflate(R.layout.time_finish_dialog_fragment, null, false);
mCancel = view.findViewById(R.id.button_cancel);
mSkip = view.findViewById(R.id.button_skip);
mStartBreak = view.findViewById(R.id.button_start_break);
mCancel.setOnClickListener(this);
mSkip.setOnClickListener(this);
mStartBreak.setOnClickListener(this);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setView(view)
.setTitle("Start Break?");
AlertDialog dialog = builder.create();
dialog.setContentView(view);
return dialog;
}
#Override
public void onClick(View view) {
switch(view.getId()){
case R.id.button_cancel:
mResponse.sendResponse(-1);
getDialog().dismiss();
break;
case R.id.button_skip:
mResponse.sendResponse(0);
getDialog().dismiss();
break;
case R.id.button_start_break:
mResponse.sendResponse(1);
getDialog().dismiss();
break;
default:
break;
}
}
#Override
public void onAttach(Context context) {
super.onAttach(context);
try{
mResponse = (sendResponse) getActivity();
}catch (ClassCastException e){
System.out.println("Error: " + e);
}
}
}
when the time is up and the app is NOT in the foreground the dialog is still launched
You should not be doing this since this will interrupt the user from doing other work which they might be doing at that time and this can be irritating.
What can I possibly do so that the dialog is launched when the app is not in the foreground?
You can show the dialog only the user is actively using your application or you can fall back to show a notification when the user is not using the app.
And if you desperately want to show a dialog, you can try a dialog themed activity
I'm making a quiz app with question about different countries. I already made it work for one country, but now I'd like to make it work for all the countries, but I don't exactly know how. I've made a question library and a quizactivity, but I don't know how to proceed right now, so I hope someone can help me.
Here is my quizactivity:
package com.example.quizapp;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class QuizActivity extends AppCompatActivity {
private QuestionLibrary mQuestionLibrary = new QuestionLibrary();
private TextView mScoreView;
private TextView mQuestionView;
private Button mButtonChoice1;
private Button mButtonChoice2;
private Button mButtonChoice3;
private Button mButtonChoice4;
private String mAnswerFrankrijk;
private int mScoreFrankrijk = 0;
private int mQuestionNumber = 0;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_quiz);
mScoreView = (TextView)findViewById(R.id.score1);
mQuestionView = (TextView)findViewById(R.id.question1);
mButtonChoice1 = (Button)findViewById(R.id.choice1);
mButtonChoice2 = (Button)findViewById(R.id.choice2);
mButtonChoice3 = (Button)findViewById(R.id.choice3);
mButtonChoice4 = (Button)findViewById(R.id.choice4);
updateQuestion();
//Start of Button Listener for Button1
mButtonChoice1.setOnClickListener(new View.OnClickListener(){
#Override
public void onClick(View view){
//My logic for Button goes in here
if (mButtonChoice1.getText() == mAnswerFrankrijk){
mScoreFrankrijk = mScoreFrankrijk + 1;
updateScore(mScoreFrankrijk);
updateQuestion();
//This line of code is optiona
Toast.makeText(QuizActivity.this, "Goed", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(QuizActivity.this, "Fout", Toast.LENGTH_SHORT).show();
updateQuestion();
}
}
});
//End of Button Listener for Button1
//Start of Button Listener for Button2
mButtonChoice2.setOnClickListener(new View.OnClickListener(){
#Override
public void onClick(View view){
//My logic for Button goes in here
if (mButtonChoice2.getText() == mAnswerFrankrijk){
mScoreFrankrijk = mScoreFrankrijk + 1;
updateScore(mScoreFrankrijk);
updateQuestion();
//This line of code is optiona
Toast.makeText(QuizActivity.this, "Goed", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(QuizActivity.this, "Fout", Toast.LENGTH_SHORT).show();
updateQuestion();
}
}
});
//End of Button Listener for Button2
//Start of Button Listener for Button3
mButtonChoice3.setOnClickListener(new View.OnClickListener(){
#Override
public void onClick(View view){
//My logic for Button goes in here
if (mButtonChoice3.getText() == mAnswerFrankrijk){
mScoreFrankrijk = mScoreFrankrijk + 1;
updateScore(mScoreFrankrijk);
updateQuestion();
//This line of code is optiona
Toast.makeText(QuizActivity.this, "Goed", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(QuizActivity.this, "Fout", Toast.LENGTH_SHORT).show();
updateQuestion();
}
}
});
//End of Button Listener for Button3
//Start of Button Listener for Button3
mButtonChoice4.setOnClickListener(new View.OnClickListener(){
#Override
public void onClick(View view){
//My logic for Button goes in here
if (mButtonChoice4.getText() == mAnswerFrankrijk){
mScoreFrankrijk = mScoreFrankrijk + 1;
updateScore(mScoreFrankrijk);
updateQuestion();
//This line of code is optional
Toast.makeText(QuizActivity.this, "Goed", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(QuizActivity.this, "Fout", Toast.LENGTH_SHORT).show();
updateQuestion();
}
}
});
//End of Button Listener for Button3
}
private void updateQuestion(){
mQuestionView.setText(mQuestionLibrary.getQuestionFrankrijk(mQuestionNumber));
mButtonChoice1.setText(mQuestionLibrary.getChoice1Frankrijk(mQuestionNumber));
mButtonChoice2.setText(mQuestionLibrary.getChoice2Frankrijk(mQuestionNumber));
mButtonChoice3.setText(mQuestionLibrary.getChoice3Frankrijk(mQuestionNumber));
mButtonChoice4.setText(mQuestionLibrary.getChoice4Frankrijk(mQuestionNumber));
mAnswerFrankrijk = mQuestionLibrary.getCorrectAnswerFrankrijk(mQuestionNumber);
mQuestionNumber++;
}
private void updateScore(int point) {mScoreView.setText("" + mScoreFrankrijk);
}
}
And here is my question library:
package com.example.quizapp;
public class QuestionLibrary {
private String mQuestionsFrankrijk [] = {
"Wat is de hoofdstad van Frankrijk?",
"Wat is de bijnaam van het Franse nationale voetbalelftal",
"Welke van de volgende landen grenst niet aan Frankrijk?",
"Bij welke sport hoort 'le maillot jaune'?",
"Welk museum in Parijs heeft een piramide als ingang?"
};
private String mChoicesFrankrijk [][] = {
{"Lyon", "Parijs", "Nice", "Bordeaux"},
{"La France", "Le Coq Sportif", "Les Bleus", "Les Gagnants"},
{"Zwitserland", "België", "Spanje", "Oostenrijk"},
{"Tennis", "Wielrennen", "Rugby", "Cricket"},
{"Musée d'Orsay", "Musée Rodin", "Louvre", "Centre Georges Pompidou"},
};
private String mCorrectAnswers [] = {"Parijs", "Les Bleus", "Oostenrijk", "Wielrennen", "Louvre"};
public String getQuestionFrankrijk(int a) {
String question = mQuestionsFrankrijk[a];
return question;
}
public String getChoice1Frankrijk(int a) {
String choice0 = mChoicesFrankrijk[a][0];
return choice0;
}
public String getChoice2Frankrijk(int a) {
String choice1 = mChoicesFrankrijk[a][1];
return choice1;
}
public String getChoice3Frankrijk(int a) {
String choice2 = mChoicesFrankrijk[a][2];
return choice2;
}
public String getChoice4Frankrijk(int a) {
String choice3 = mChoicesFrankrijk[a][3];
return choice3;
}
public String getCorrectAnswerFrankrijk(int a) {
String answer = mCorrectAnswers[a];
return answer;
}
}
The easiest solution I can think is to make QuestionLibrary an interface or abstract class. Then implement a Country1QuestionLibrary with a specific country's questions and Country2QuestionLibrary with another set of questions. Then you can dynamically swap out the set of questions being presented to the user by doing
questionLibrary = new Country1QuestionLibrary();
Then you need a way for your user to change the country. On the UI, add another button that's "Change Country" implemented similarly to how your other buttons are working. In the onClickListener, assign the other implementation of QuestionLibrary to the available questions and refresh the question and answers views.
As with most things programming, there are a bunch of ways to implement this. If you can implement the path I'm showing, take some time to try and come up with a different solution on your own after seeing the downfalls or restrictions of this solution.
I got a problem with CountDownTimer's StartButton: the timer doesn't start after pressing the button. How do I fix that?
I want to start the timer by pressing button buttonCount.
Can someone help me please?
int clicks = 0;
TextView textCount;
ImageButton buttonCount;
int guessCount =0;
boolean started = false;
boolean timerProcessing = false;
private CountDownTimer count;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_newgame);
count = new CountDownTimer(15000, 1000) {
public void onTick(long millisUntilFinished) {
int seconds = (int) ((millisUntilFinished / 1000));
textic.setText("Time Left: " + millisUntilFinished / 1000);
}
public void onFinish() {
textic.setText("Time's Up!");
buttonCount.setEnabled(false);
if (clicks > oldscore)
getSharedPreferences("myPrefs", MODE_PRIVATE).edit().putInt("highscore", clicks).commit();
}
};
final int oldscore = getSharedPreferences("myPrefs", MODE_PRIVATE).getInt("highscore", 0);
final TextView textView = (TextView) findViewById(R.id.applesEaten);
buttonCount = (ImageButton) findViewById(R.id.button);
buttonCount.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
clicks++;
textView.setText("Clicks: " + clicks);
TextView textView = (TextView) findViewById(R.id.topScoreView);
textView.setText("Best: " + oldscore);
if(!started){
count.start();
started = true;
timerProcessing = true;
}
}
});
final TextView textic = (TextView) findViewById(R.id.textView2);
}
It seems to me this is what you really want to do:
private int clicks = 0;
private TextView textCount;
private ImageButton buttonCount;
private int guessCount = 0;
private CountDownTimer count; // RENAMED
private boolean started = false; // FALSE.
private boolean timerProcessing = false;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_newgame);
count = new CountDownTimer(15000, 1000) { // MOVED UP
public void onTick(long millisUntilFinished) {
int seconds = (int) ((millisUntilFinished / 1000));
textic.setText("Time Left: " + millisUntilFinished / 1000);
}
public void onFinish() {
textic.setText("Time's Up!");
buttonCount.setEnabled(false);
if (clicks > oldscore)
getSharedPreferences("myPrefs", MODE_PRIVATE).edit().putInt("highscore", clicks).commit();
}
};
final int oldscore = getSharedPreferences("myPrefs", MODE_PRIVATE).getInt("highscore", 0);
final TextView textView = (TextView) findViewById(R.id.applesEaten);
buttonCount = (ImageButton) findViewById(R.id.button);
buttonCount.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
clicks++;
textView.setText("Clicks: " + clicks);
TextView textView = (TextView) findViewById(R.id.topScoreView);
textView.setText("Best: " + oldscore);
if(!started){
count.start(); // START COUNTDOWN TIMER
started = true;
timerProcessing = true;
}
}
});
final TextView textic = (TextView) findViewById(R.id.textView2);
}
And if you really want to start another CountDownTimer than the one you create at the bottom (named count). Then you need to instantiate it and set its behaviour, just like you do for the other CountownTimer.
Also, all the variables you use need to be created before (textic, oldscore)
Like in "Who wants to be a millionaire". When a user press a 50/50 help button I want two wrong answers to hide, therefor to setText to "" for two buttons, BUT not "the answer" one. But I don't know how to do that. I'm using sqlite prepopulated database with questions and answers. My 50/50 help button is bPolaPola. Here's my game class:
public class NeogranicenoPetGresaka extends SwarmActivity implements OnClickListener{
MyCount brojacVremena = new MyCount(16000, 1000);
LinkedList<Long> mAnsweredQuestions = new LinkedList<Long>();
private String generateWhereClause(){
StringBuilder result = new StringBuilder();
for (Long l : mAnsweredQuestions){
result.append(" AND _ID <> " + l);
}
return result.toString();
}
Button bIzlazIzKviza, bOdgovor1, bOdgovor2, bOdgovor3, bOdgovor4, bPolaPola;
TextView question, netacniOdg, score, countdown;
int brojacPogresnihOdgovora = 0;
int brojacTacnihOdgovora = 0;
public static String tacanOdg;
Runnable mLaunchTask = new Runnable() {
public void run() {
nextQuestion();
brojacVremena.start();
}
};
Runnable mLaunchTaskFinish = new Runnable() {
public void run() {
brojacVremena.cancel();
finish();
}
};
private class Answer {
public Answer(String opt, boolean correct) {
option = opt;
isCorrect = correct;
}
String option;
boolean isCorrect;
}
Handler mHandler = new Handler();
final OnClickListener clickListener = new OnClickListener() {
public void onClick(View v) {
Answer ans = (Answer) v.getTag();
if (ans.isCorrect) {
brojacVremena.cancel();
brojacTacnihOdgovora = brojacTacnihOdgovora + 5;
Intent i = new Intent("rs.androidaplikacijekvizopstekulture.TACANODGOVOR");
startActivity(i);
mHandler.postDelayed(mLaunchTask,1200);
}
else{
brojacVremena.cancel();
brojacPogresnihOdgovora++;
Intent i = new Intent(getApplicationContext(), PogresanOdgovor.class);
i.putExtra("tacanOdgovor", tacanOdg);
startActivity(i);
mHandler.postDelayed(mLaunchTask,2200);
}
}
};
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.neograniceno);
Typeface dugmad = Typeface.createFromAsset(getAssets(), "Bebas.ttf");
Typeface pitanje = Typeface.createFromAsset(getAssets(), "myriad.ttf");
bIzlazIzKviza = (Button) findViewById(R.id.bIzlazIzKvizaN);
netacniOdg = (TextView) findViewById(R.id.tvBrojPitanjaN);
question = (TextView) findViewById(R.id.tvPitanjeN);
bOdgovor1 = (Button) findViewById(R.id.bOdgovorN1);
bOdgovor2 = (Button) findViewById(R.id.bOdgovorN2);
bOdgovor3 = (Button) findViewById(R.id.bOdgovorN3);
bOdgovor4 = (Button) findViewById(R.id.bOdgovorN4);
bPolaPola = (Button) findViewById(R.id.bPolaPolaN);
score = (TextView) findViewById(R.id.tvSkor2N);
countdown = (TextView) findViewById(R.id.tvCountdownN);
bOdgovor1.setTypeface(dugmad);
bOdgovor2.setTypeface(dugmad);
bOdgovor3.setTypeface(dugmad);
bOdgovor4.setTypeface(dugmad);
bPolaPola.setTypeface(dugmad);
bIzlazIzKviza.setTypeface(dugmad);
netacniOdg.setTypeface(dugmad);
question.setTypeface(pitanje);
score.setTypeface(dugmad);
countdown.setTypeface(dugmad);
nextQuestion(); //startuje prvo pitanje!
brojacVremena.start(); //startuje brojac vremena
}
public class MyCount extends CountDownTimer {
public MyCount(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
#Override
public void onFinish() {
Intent i = new Intent(getApplicationContext(), PogresanOdgovor.class);
i.putExtra("tacanOdgovor", tacanOdg);
startActivity(i);
mHandler.postDelayed(mLaunchTask,2200);
brojacPogresnihOdgovora++;
}
#Override
public void onTick(long millisUntilFinished) {
countdown.setText("" + millisUntilFinished / 1000);
}
}
public void onClick(View v) {
// TODO Auto-generated method stub
}
#Override public void onStop() {
super.onStop();
brojacVremena.cancel();
}
#Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
}
public void nextQuestion() {
TestAdapter mDbHelper = new TestAdapter(this);
mDbHelper.createDatabase();
try{ //Pokusava da otvori db
mDbHelper.open(); //baza otvorena
Cursor c = mDbHelper.getTestData(generateWhereClause());
mAnsweredQuestions.add(c.getLong(0));
List<Answer> labels = new ArrayList<Answer>();
labels.add(new Answer(c.getString(2), true));
labels.add(new Answer(c.getString(3), false));
labels.add(new Answer(c.getString(4), false));
labels.add(new Answer(c.getString(5), false));
Collections.shuffle(labels);
tacanOdg = c.getString(2);
if(brojacPogresnihOdgovora < 5){
question.setText(c.getString(1));
bOdgovor1.setText(labels.get(0).option);
bOdgovor1.setTag(labels.get(0));
bOdgovor1.setOnClickListener(clickListener);
bOdgovor2.setText(labels.get(1).option);
bOdgovor2.setTag(labels.get(1));
bOdgovor2.setOnClickListener(clickListener);
bOdgovor3.setText(labels.get(2).option);
bOdgovor3.setTag(labels.get(2));
bOdgovor3.setOnClickListener(clickListener);
bOdgovor4.setText(labels.get(3).option);
bOdgovor4.setTag(labels.get(3));
bOdgovor4.setOnClickListener(clickListener);
netacniOdg.setText("" + brojacPogresnihOdgovora);
score.setText("Score: " + brojacTacnihOdgovora);
}
else{
brojacVremena.cancel();
Intent i = new Intent(getApplicationContext(), Rezultat.class);
i.putExtra("noviRezultat", brojacTacnihOdgovora);
startActivity(i);
mHandler.postDelayed(mLaunchTaskFinish,4000);
SwarmLeaderboard.submitScore(6863, brojacTacnihOdgovora);
}
}
finally{ // kada zavrsi sa koriscenjem baze podataka, zatvara db
mDbHelper.close();
}
bIzlazIzKviza.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
finish();
}
});
}
}
OK, as jazzbassrob pointed I need to be more specific. I need to setText to my bPolaPola button to "", empty String, but my main problem is that I don't know after collections shuffle where my answers will end up, so I don't know which buttons to setText to. How to know where my answers end up after shuffle?
I actually did not try anything cause in this specific situation I really don't know where to start.
How about running a query which will find the correct option even before the user clicks on one, then you find the correct button out of the four options. After this, use setText="" on any random two buttons other than the one which points to the correct answer.