英文:
Cant calculate score for dropdown selection game
问题
以下是您提供的代码的翻译部分:
package com.example.securityapp;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.analytics.FirebaseAnalytics;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.auth.UserProfileChangeRequest;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.MutableData;
import com.google.firebase.database.Transaction;
import com.google.firebase.database.ValueEventListener;
import com.google.firebase.database.core.Tag;
import java.util.ArrayList;
import java.util.Collections;
public class common_attacks_questions extends AppCompatActivity {
    DatabaseReference databaseUsers, databaseUsername;
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    FirebaseAuth mAuth;
    TextView stmnt;
    Spinner answers;
    ImageView forward;
    Button points, finished;
    attacksStatements atStatements;
    int statementsLength;
    ArrayList<ItemWithOptions> statementList;
    int currentStatement = 0;
    int grade = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_common_attacks_questions);
        databaseUsers = database.getReference("Scores");
        databaseUsername = database.getReference("Users");
        mAuth = FirebaseAuth.getInstance();
        FirebaseUser user = mAuth.getCurrentUser();
        forward = (ImageView) findViewById(R.id.forward);
        answers = (Spinner) findViewById(R.id.dropDown);
        stmnt = (TextView) findViewById(R.id.statement_TV);
        atStatements = new attacksStatements();
        statementsLength = atStatements.attackStatements.length;
        statementList = new ArrayList<>();
        finished = (Button) findViewById(R.id.finish);
        points = (Button) findViewById(R.id.final_score);
        for (int i = 0; i < statementsLength; i++)
        {
            statementList.add(new ItemWithOptions(atStatements.getStatement(i), atStatements.getAnswer(i), atStatements.getOptions(i)));
        }
        Collections.shuffle(statementList);
        setStmnt(currentStatement);
        setOptions(currentStatement);
    }
    // 其他方法和代码保持不变,没有翻译变化
}
请注意,我只对您提供的Java代码进行了翻译,没有对其中的注释和变量名称进行翻译。如果您需要其他部分的翻译或解释,请随时提问。
英文:
Im making a game and the user has to select the missing work from a dropdown box. The user selects their choice and clicks next. However, I cant seem to calculate the score and when I get to the last question, the score is supposed to pop up in a dialog, but instead the app breaks?
Can anyone help me get the score to display without the app breaking?
Thanks ![]()
Im getting these errors
> at com.example.securityapp.common_attacks_questions.setOptions(common_attacks_questions.java:107)
at com.example.securityapp.common_attacks_questions.nextClicked(common_attacks_questions.java:96)
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-js -->
package com.example.securityapp;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.analytics.FirebaseAnalytics;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.auth.UserProfileChangeRequest;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.MutableData;
import com.google.firebase.database.Transaction;
import com.google.firebase.database.ValueEventListener;
import com.google.firebase.database.core.Tag;
import java.util.ArrayList;
import java.util.Collections;
public class common_attacks_questions extends AppCompatActivity {
    DatabaseReference databaseUsers, databaseUsername;
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    FirebaseAuth mAuth;
    TextView stmnt;
    Spinner answers;
    ImageView forward;
    Button points, finished;
    attacksStatements atStatements;
    int statementsLength;
    ArrayList<ItemWithOptions> statementList;
    int currentStatement = 0;
    int grade = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_common_attacks_questions);
        databaseUsers = database.getReference("Scores");
        databaseUsername = database.getReference("Users");
        mAuth = FirebaseAuth.getInstance();
        FirebaseUser user = mAuth.getCurrentUser();
        forward = (ImageView) findViewById(R.id.forward);
        answers = (Spinner) findViewById(R.id.dropDown);
        stmnt = (TextView) findViewById(R.id.statement_TV);
        atStatements = new attacksStatements();
        statementsLength = atStatements.attackStatements.length;
        statementList = new ArrayList<>();
        finished = (Button) findViewById(R.id.finish);
        points = (Button) findViewById(R.id.final_score);
        for (int i = 0; i < statementsLength; i++)
        {
            statementList.add(new ItemWithOptions(atStatements.getStatement(i), atStatements.getAnswer(i), atStatements.getOptions(i)));
        }
        Collections.shuffle(statementList);
        setStmnt(currentStatement);
        setOptions(currentStatement);
    }
    public void nextClicked(View view) {
        if (checkAnswer(currentStatement)) {
            grade++;
        }
        currentStatement++;
        setOptions(currentStatement);
        if (currentStatement >= statementsLength) {
            score();
            AlertDialog.Builder builder1 = new AlertDialog.Builder(this);
            builder1.setMessage("You scored " + grade + " points!").show();
            return;
        }
        if (currentStatement <= statementsLength)
            setStmnt(currentStatement);
            setOptions(currentStatement);
    }
    //setOptions
    private void setOptions(int number)
    {
            ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, statementList.get(number).getOptions());
            spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // The drop down view
            answers.setAdapter(spinnerArrayAdapter);
    }
    // show Statement
    private void setStmnt(int number) {
        stmnt.setText(statementList.get(number).getStatement());
    }
    //check is answer is right
    private boolean checkAnswer(int number) {
        String selection = answers.getSelectedItem().toString();
        String answer = statementList.get(number).getAnswer();
        if (selection == answer) {
            return answer.equals(true);
        }
        return false;
    }
    public void score() {
        String id = mAuth.getCurrentUser().getUid();
        DatabaseReference score = databaseUsers.child(id).child("Points");
        DatabaseReference order = databaseUsers.child(id).child("Order");
        DatabaseReference set_username = databaseUsers.child(id).child("Username");
        final DatabaseReference get_user_name = databaseUsername.child(id).child("username");
        FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
        final int pointsEarned = grade;
        order.runTransaction(new Transaction.Handler() {
            @Override
            public Transaction.Result doTransaction(@NonNull MutableData mutableData) {
                mutableData.setValue((mutableData.getValue() == null ? 0 : mutableData.getValue(Integer.class)) -pointsEarned);
                return Transaction.success(mutableData);
            }
            @Override
            public void onComplete(@Nullable DatabaseError databaseError, boolean b, @Nullable DataSnapshot dataSnapshot) {
            }
        });
        score.runTransaction(new Transaction.Handler() {
                                 @Override
                                 public Transaction.Result doTransaction(MutableData mutableData) {
                                     System.out.println("You scored: " + pointsEarned);
                                     System.out.println("The current score is: " + mutableData.getValue(Integer.class));
                                     mutableData.setValue((mutableData.getValue() == null ? 0 : mutableData.getValue(Integer.class)) + pointsEarned);
                                     System.out.println("The new score is: " + mutableData.getValue(Integer.class));
                                     return Transaction.success(mutableData);
                                 }
                                 @Override
                                 public void onComplete(@Nullable DatabaseError databaseError, boolean b, @Nullable DataSnapshot dataSnapshot) {
                                 }
                             }
        );
        get_user_name.runTransaction(new Transaction.Handler() {
            @NonNull
            @Override
            public Transaction.Result doTransaction(@NonNull MutableData mutableData) {
                String name = mutableData.getValue(String.class);
                return Transaction.success(mutableData);
            }
            @Override
            public void onComplete(@Nullable DatabaseError databaseError, boolean b, @Nullable DataSnapshot dataSnapshot) {
                String username = dataSnapshot.getValue().toString();
                System.out.println("USERNAME: " + username);
            }
        });
        set_username.runTransaction(new Transaction.Handler() {
            @NonNull
            @Override
            public Transaction.Result doTransaction(@NonNull MutableData mutableData) {
                mutableData.setValue(mAuth.getCurrentUser().getEmail());
                return Transaction.success(mutableData);
            }
            @Override
            public void onComplete(@Nullable DatabaseError databaseError, boolean b, @Nullable DataSnapshot dataSnapshot) {
            }
        });
        Toast.makeText(this, "You scored " + grade + " points!", Toast.LENGTH_LONG).show();
        grade = 0;
    }
    public void FinishedOnClick (View view)
    {
        Intent intent_finished = new Intent(common_attacks_questions.this, industry_standards_rating_screen.class);
        startActivity(intent_finished);
        finish();
    }
}
<!-- end snippet -->
New Code which I can see it printing the correct answer and grade when I run it, but it breaks after the last one because of out of bounds....
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-js -->
package com.example.securityapp;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.analytics.FirebaseAnalytics;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.auth.UserProfileChangeRequest;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.MutableData;
import com.google.firebase.database.Transaction;
import com.google.firebase.database.ValueEventListener;
import com.google.firebase.database.core.Tag;
import java.util.ArrayList;
import java.util.Collections;
public class common_attacks_questions extends AppCompatActivity {
    DatabaseReference databaseUsers, databaseUsername;
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    FirebaseAuth mAuth;
    TextView stmnt;
    Spinner answers;
    ImageView forward;
    Button points, finished;
    attacksStatements atStatements;
    int statementsLength;
    ArrayList<ItemWithOptions> statementList;
    int currentStatement = 0;
    int grade = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_common_attacks_questions);
        databaseUsers = database.getReference("Scores");
        databaseUsername = database.getReference("Users");
        mAuth = FirebaseAuth.getInstance();
        FirebaseUser user = mAuth.getCurrentUser();
        forward = (ImageView) findViewById(R.id.forward);
        answers = (Spinner) findViewById(R.id.dropDown);
        stmnt = (TextView) findViewById(R.id.statement_TV);
        atStatements = new attacksStatements();
        statementsLength = atStatements.attackStatements.length;
        statementList = new ArrayList<>();
        finished = (Button) findViewById(R.id.finish);
        points = (Button) findViewById(R.id.final_score);
        for (int i = 0; i < statementsLength; i++)
        {
            statementList.add(new ItemWithOptions(atStatements.getStatement(i), atStatements.getAnswer(i), atStatements.getOptions(i)));
        }
        Collections.shuffle(statementList);
        setStmnt(currentStatement);
        setOptions(currentStatement);
    }
    //check is answer is right
    private boolean checkAnswer(int number) {
        String selection = answers.getSelectedItem().toString();
        String answer = statementList.get(number).getAnswer();
        System.out.println(selection + " " + answer);
        if (selection.equals(answer)) {
            System.out.println("This is the right answer");
            grade++;
            System.out.println("Your grade is " + grade);
            return answer.equals("true");
        }
        return false;
    }
    public void nextClicked(View view) {
        
        checkAnswer(currentStatement);
        if (currentStatement >= statementsLength) {
            score();
            AlertDialog.Builder builder1 = new AlertDialog.Builder(this);
            builder1.setMessage("You scored " + grade + " points!").show();
            return;
        }
        if (currentStatement <= statementsLength ) {
            currentStatement++;
            setStmnt(currentStatement);
            setOptions(currentStatement);
        }
    }
    //setOptions
    private void setOptions(int number)
    {
        ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, statementList.get(number).getOptions());
        spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // The drop down view
        answers.setAdapter(spinnerArrayAdapter);
    }
    // show Statement
    private void setStmnt(int number) {
        stmnt.setText(statementList.get(number).getStatement());
    }
    public void score() {
        String id = mAuth.getCurrentUser().getUid();
        DatabaseReference score = databaseUsers.child(id).child("Points");
        DatabaseReference order = databaseUsers.child(id).child("Order");
        DatabaseReference set_username = databaseUsers.child(id).child("Username");
        final DatabaseReference get_user_name = databaseUsername.child(id).child("username");
        FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
        final int pointsEarned = grade;
        order.runTransaction(new Transaction.Handler() {
            @Override
            public Transaction.Result doTransaction(@NonNull MutableData mutableData) {
                mutableData.setValue((mutableData.getValue() == null ? 0 : mutableData.getValue(Integer.class)) -pointsEarned);
                return Transaction.success(mutableData);
            }
            @Override
            public void onComplete(@Nullable DatabaseError databaseError, boolean b, @Nullable DataSnapshot dataSnapshot) {
            }
        });
        score.runTransaction(new Transaction.Handler() {
                                 @Override
                                 public Transaction.Result doTransaction(MutableData mutableData) {
                                     System.out.println("You scored: " + pointsEarned);
                                     System.out.println("The current score is: " + mutableData.getValue(Integer.class));
                                     mutableData.setValue((mutableData.getValue() == null ? 0 : mutableData.getValue(Integer.class)) + pointsEarned);
                                     System.out.println("The new score is: " + mutableData.getValue(Integer.class));
                                     return Transaction.success(mutableData);
                                 }
                                 @Override
                                 public void onComplete(@Nullable DatabaseError databaseError, boolean b, @Nullable DataSnapshot dataSnapshot) {
                                 }
                             }
        );
        get_user_name.runTransaction(new Transaction.Handler() {
            @NonNull
            @Override
            public Transaction.Result doTransaction(@NonNull MutableData mutableData) {
                String name = mutableData.getValue(String.class);
                return Transaction.success(mutableData);
            }
            @Override
            public void onComplete(@Nullable DatabaseError databaseError, boolean b, @Nullable DataSnapshot dataSnapshot) {
                String username = dataSnapshot.getValue().toString();
                System.out.println("USERNAME: " + username);
            }
        });
        set_username.runTransaction(new Transaction.Handler() {
            @NonNull
            @Override
            public Transaction.Result doTransaction(@NonNull MutableData mutableData) {
                mutableData.setValue(mAuth.getCurrentUser().getEmail());
                return Transaction.success(mutableData);
            }
            @Override
            public void onComplete(@Nullable DatabaseError databaseError, boolean b, @Nullable DataSnapshot dataSnapshot) {
            }
        });
        Toast.makeText(this, "You scored " + grade + " points!", Toast.LENGTH_LONG).show();
        grade = 0;
    }
    public void FinishedOnClick (View view)
    {
        Intent intent_finished = new Intent(common_attacks_questions.this, industry_standards_rating_screen.class);
        startActivity(intent_finished);
        finish();
    }
}
<!-- end snippet -->
专注分享java语言的经验与见解,让所有开发者获益!

评论