-1

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)
  • It's very difficult to debug a crash without a stack trace. See [Unfortunately MyApp has stopped. How can I solve this?](/q/23353173) for Android-specific advice, and [What is a stack trace, and how can I use it to debug my application errors?](/q/3988788) for advice on what to do once you have the stack trace. If you still need help, edit your question to include the **complete stack trace**, as well as **which line of your code** the stack trace points to. – Ryan M Aug 03 '21 at 05:41

1 Answers1

0

Okay, I figured this out for myself. The images that I was trying to include in the app were too big for the drawable folder. Instead, I moved them to the mipmap folder.

Then I changed all references in the code to reflect the new location.

For example:

R.mipmap.img_quote_0