I am new to building apps in Android Studio and Java in general. However, I have been following a course with CodeAcademy, but I have encountered an issue when trying to load certain images to the ImageView. However, the information found on the page and their support forums have been no help.
I have this ImageView in my activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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">
<ImageView
android:id="@+id/iv_main_question_image"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:adjustViewBounds="true"
tools:src="@tools:sample/avatars"/>
<TextView
tools:text="How much wood would a wood chuck chuck if a wood chuck could chuck wood?"
android:id="@+id/tv_main_question_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:textSize="18sp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toTopOf="@id/ll_main_first_row_buttons"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"/>
<TextView
android:id="@+id/tv_main_questions_remaining_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="bold"
android:textSize="48sp"
android:layout_marginStart="8dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
tools:text="99"
android:layout_marginLeft="8dp" />
<TextView
android:id="@+id/tv_main_questions_remaining"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:text="questions\nremaining"
app:layout_constraintTop_toTopOf="@id/tv_main_questions_remaining_count"
app:layout_constraintBottom_toBottomOf="@id/tv_main_questions_remaining_count"
app:layout_constraintLeft_toRightOf="@id/tv_main_questions_remaining_count"
android:layout_marginLeft="8dp" />
<Button
style="@style/Widget.AppCompat.Button.Colored"
android:id="@+id/btn_main_submit_answer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:text="submit"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="@id/tv_main_questions_remaining_count"
android:layout_marginRight="8dp" />
<LinearLayout
android:id="@+id/ll_main_first_row_buttons"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:orientation="horizontal"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toTopOf="@id/ll_main_second_row_buttons">
<Button
style="@style/Widget.AppCompat.Button.Colored"
android:id="@+id/btn_main_answer_0"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
tools:text="Answer 0" />
<Button
style="@style/Widget.AppCompat.Button.Colored"
android:id="@+id/btn_main_answer_1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
tools:text="Answer 1" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_main_second_row_buttons"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:orientation="horizontal"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toTopOf="@id/btn_main_submit_answer">
<Button
style="@style/Widget.AppCompat.Button.Colored"
android:id="@+id/btn_main_answer_2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
tools:text="Answer 2" />
<Button
style="@style/Widget.AppCompat.Button.Colored"
android:id="@+id/btn_main_answer_3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
tools:text="Answer 3" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
In my MainActivity.java file, I have the following code:
package com.codeacademy.unquote2;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
int currentQuestionIndex;
int totalCorrect;
int totalQuestions;
ArrayList<Question> questions;
// TODO 3-A: Declare View member variables
ImageView questionImageView;
TextView questionTextView;
TextView questionRemainingTextView;
Button answer0Button;
Button answer1Button;
Button answer2Button;
Button answer3Button;
Button submitButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// TODO 2-G: Show app icon in ActionBar
setContentView(R.layout.activity_main);
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setLogo(R.drawable.ic_unquote_icon);
getSupportActionBar().setDisplayUseLogoEnabled(true);
getSupportActionBar().setElevation(0);
// TODO 3-B: assign View member variables
questionImageView = findViewById(R.id.iv_main_question_image);
questionTextView = findViewById(R.id.tv_main_question_title);
questionRemainingTextView = findViewById(R.id.tv_main_questions_remaining_count);
answer0Button = findViewById(R.id.btn_main_answer_0);
answer1Button = findViewById(R.id.btn_main_answer_1);
answer2Button = findViewById(R.id.btn_main_answer_2);
answer3Button = findViewById(R.id.btn_main_answer_3);
submitButton = findViewById(R.id.btn_main_submit_answer);
// TODO 4-E: set onClickListener for each answer Button
// TODO 5-A: set onClickListener for the submit answer Button
startNewGame();
}
// TODO 3-F: displayQuestion(Question question) {...}
public void displayQuestion(Question question)
{
questionImageView.setImageResource(R.drawable.img_quote_0);
questionTextView.setText(question.questionText);
answer0Button.setText(question.answer0);
answer1Button.setText(question.answer1);
answer2Button.setText(question.answer2);
answer3Button.setText(question.answer3);
}
// TODO 3-C: displayQuestionsRemaining(int questionRemaining) {...}
public void displayQuestionsRemaining(int questionRemaining)
{
questionRemainingTextView.setText(questionRemaining+"");
}
// TODO 4-A: onAnswerSelected(int answerSelected) {...}
void onAnswerSubmission() {
Question currentQuestion = getCurrentQuestion();
if (currentQuestion.isCorrect()) {
totalCorrect = totalCorrect + 1;
}
questions.remove(currentQuestion);
// TODO 3-D.i: Uncomment the line below after implementing displayQuestionsRemaining(int)
displayQuestionsRemaining(questions.size());
if (questions.size() == 0) {
String gameOverMessage = getGameOverMessage(totalCorrect, totalQuestions);
// TODO 5-D: Show a popup instead
System.out.println(gameOverMessage);
} else {
chooseNewQuestion();
// TODO 3-H.i: uncomment after implementing displayQuestion(Question)
displayQuestion(getCurrentQuestion());
}
}
void startNewGame() {
questions = new ArrayList<>();
// TODO 2-H: Provide actual drawables for each of these questions!
Question question0 = new Question(R.drawable.img_quote_0, "Pretty good advice, and perhaps a scientist did say it… Who actually did?", "Albert Einstein", "Isaac Newton", "Rita Mae Brown", "Rosalind Franklin", 2);
Question question1 = new Question(R.drawable.img_quote_1, "Was honest Abe honestly quoted? Who authored this pithy bit of wisdom?", "Edward Stieglitz", "Maya Angelou", "Abraham Lincoln", "Ralph Waldo Emerson", 0);
Question question2 = new Question(R.drawable.img_quote_2, "Easy advice to read, difficult advice to follow — who actually said it?", "Martin Luther King Jr.", "Mother Teresa", "Fred Rogers", "Oprah Winfrey", 1);
Question question3 = new Question(R.drawable.img_quote_3, "Insanely inspiring, insanely incorrect (maybe). Who is the true source of this inspiration?", "Nelson Mandela", "Harriet Tubman", "Mahatma Gandhi", "Nicholas Klein", 3);
Question question4 = new Question(R.drawable.img_quote_4, "A peace worth striving for — who actually reminded us of this?", "Malala Yousafzai", "Martin Luther King Jr.", "Liu Xiaobo", "Dalai Lama", 1);
Question question5 = new Question(R.drawable.img_quote_5, "Unfortunately, true — but did Marilyn Monroe convey it or did someone else?", "Laurel Thatcher Ulrich", "Eleanor Roosevelt", "Marilyn Monroe", "Queen Victoria", 0);
questions.add(question0);
questions.add(question1);
questions.add(question2);
questions.add(question3);
questions.add(question4);
questions.add(question5);
totalCorrect = 0;
totalQuestions = questions.size();
Question firstQuestion = chooseNewQuestion();
// TODO 3-D.ii: Uncomment the line below after implementing displayQuestionsRemaining(int)
displayQuestionsRemaining(questions.size());
// TODO 3-H.ii: Uncomment after implementing displayQuestion(Question)
displayQuestion(firstQuestion);
}
Question chooseNewQuestion() {
int newQuestionIndex = generateRandomNumber(questions.size());
currentQuestionIndex = newQuestionIndex;
return questions.get(currentQuestionIndex);
}
int generateRandomNumber(int max) {
double randomNumber = Math.random();
double result = max * randomNumber;
return (int) result;
}
Question getCurrentQuestion() {
Question currentQuestion = questions.get(currentQuestionIndex);
return currentQuestion;
}
String getGameOverMessage(int totalCorrect, int totalQuestions) {
if (totalCorrect == totalQuestions) {
return "You got all " + totalQuestions + " right! You won!";
} else {
return "You got " + totalCorrect + " right out of " + totalQuestions + ". Better luck next time!";
}
}
}
And a third file, Question.java, has the following:
package com.codeacademy.unquote2;
public class Question {
int imageId;
String questionText;
String answer0;
String answer1;
String answer2;
String answer3;
int correctAnswer;
int playerAnswer;
public Question(int imageIdentifier,
String questionString,
String answerZero,
String answerOne,
String answerTwo,
String answerThree,
int correctAnswerIndex) {
imageId = imageIdentifier;
questionText = questionString;
answer0 = answerZero;
answer1 = answerOne;
answer2 = answerTwo;
answer3 = answerThree;
correctAnswer = correctAnswerIndex;
playerAnswer = -1;
}
public boolean isCorrect() {
return playerAnswer == correctAnswer;
}
}
Edit: Included the stack trace, it looks like it points to an issue where the image it tries to draw is too large? I believe this is in reference to the line in the acitivity_main.xml which reads as the following in the displayQuestion method:
questionImageView.setImageResource(R.drawable.img_quote_0);
Stack Trace:
2021-08-03 19:16:36.855 8860-8860/com.codeacademy.unquote2 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.codeacademy.unquote2, PID: 8860
java.lang.RuntimeException: Canvas: trying to draw too large(206483200bytes) bitmap.
at android.view.DisplayListCanvas.throwIfCannotDraw(DisplayListCanvas.java:229)
at android.view.RecordingCanvas.drawBitmap(RecordingCanvas.java:97)
at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:529)
at android.widget.ImageView.onDraw(ImageView.java:1367)
at android.view.View.draw(View.java:19192)
at android.view.View.updateDisplayListIfDirty(View.java:18142)
at android.view.View.draw(View.java:18920)
at android.view.ViewGroup.drawChild(ViewGroup.java:4236)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4022)
at androidx.constraintlayout.widget.ConstraintLayout.dispatchDraw(ConstraintLayout.java:1975)
at android.view.View.updateDisplayListIfDirty(View.java:18133)
at android.view.View.draw(View.java:18920)
at android.view.ViewGroup.drawChild(ViewGroup.java:4236)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4022)
at android.view.View.updateDisplayListIfDirty(View.java:18133)
at android.view.View.draw(View.java:18920)
at android.view.ViewGroup.drawChild(ViewGroup.java:4236)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4022)
at android.view.View.updateDisplayListIfDirty(View.java:18133)
at android.view.View.draw(View.java:18920)
at android.view.ViewGroup.drawChild(ViewGroup.java:4236)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4022)
at android.view.View.updateDisplayListIfDirty(View.java:18133)
at android.view.View.draw(View.java:18920)
at android.view.ViewGroup.drawChild(ViewGroup.java:4236)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4022)
at android.view.View.updateDisplayListIfDirty(View.java:18133)
at android.view.View.draw(View.java:18920)
at android.view.ViewGroup.drawChild(ViewGroup.java:4236)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4022)
at android.view.View.draw(View.java:19195)
at com.android.internal.policy.DecorView.draw(DecorView.java:788)
at android.view.View.updateDisplayListIfDirty(View.java:18142)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:669)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:675)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:783)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2992)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2806)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2359)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1392)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6752)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
at android.view.Choreographer.doCallbacks(Choreographer.java:723)
at android.view.Choreographer.doFrame(Choreographer.java:658)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)