英文:
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语言的经验与见解,让所有开发者获益!
评论