Android Studio викторина сохранение счета
В настоящее время я делаю приложение викторины о флаге и хочу добавить оценки. Ниже вы можете увидеть его изображение; каждый флаг является фрагментом, и когда вы нажимаете их, правая часть позволяет вам отправить ответ.
Когда вы вводите правильный ответ, появляется "правильное" сообщение, и вы можете перейти к следующему флагу. Я хочу, чтобы правильный ответ давал 1 балл, а неправильный (или при нажатии пропуска или подсказки) - ноль. В конце счет суммируется. Однако я не уверен, как это сделать. Я создал файл ScoreActivity.java, в котором результаты будут зарегистрированы (хотя в настоящее время он пуст), и я попытался написать код, показанный ниже.
Play.java
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.app.FragmentManager;
import android.view.View;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.view.View.OnClickListener;
import android.view.LayoutInflater;
import android.widget.Button;
import android.widget.ImageButton;
import android.view.ViewGroup;
import layout.FragmentOne;
import layout.FragmentTwo;
import layout.FragmentThree;
import layout.FragmentDefault;
public class Play extends MainActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_play);
final ImageButton imageBtn10 = (ImageButton) findViewById(R.id.imageButton10);
final ImageButton imageBtn9 = (ImageButton) findViewById(R.id.imageButton9);
final ImageButton imageBtn8 = (ImageButton) findViewById(R.id.imageButton8);
final ImageButton imageBtn7 = (ImageButton) findViewById(R.id.imageButton7);
final ImageButton imageBtn6 = (ImageButton) findViewById(R.id.imageButton6);
final ImageButton imageBtn5 = (ImageButton) findViewById(R.id.imageButton5);
final ImageButton imageBtn4 = (ImageButton) findViewById(R.id.imageButton4);
final ImageButton imageBtn3 = (ImageButton) findViewById(R.id.imageButton3);
FragmentManager fragMan = getFragmentManager();
FragmentTransaction fragTrans = fragMan.beginTransaction();
FragmentDefault fd = new FragmentDefault();
fragTrans.replace(R.id.fragment_place, fd);
fragTrans.commit();
fragTrans.hide(new FragmentOne());
fragTrans.hide(new FragmentTwo());
fragTrans.hide(new FragmentThree());
imageBtn10.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fragMan = getFragmentManager();
FragmentTransaction fragTrans = fragMan.beginTransaction();
fragTrans.replace(R.id.fragment_place, new FragmentOne());
fragTrans.commit();
imageBtn10.setEnabled(false);
}
});
imageBtn9.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fragMan = getFragmentManager();
FragmentTransaction fragTrans = fragMan.beginTransaction();
fragTrans.replace(R.id.fragment_place, new FragmentTwo());
fragTrans.commit();
}
});
imageBtn8.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fragMan = getFragmentManager();
FragmentTransaction fragTrans = fragMan.beginTransaction();
fragTrans.replace(R.id.fragment_place, new FragmentThree());
fragTrans.commit();
}
});
imageBtn7.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fragMan = getFragmentManager();
FragmentTransaction fragTrans = fragMan.beginTransaction();
fragTrans.replace(R.id.fragment_place, new FragmentThree());
fragTrans.commit();
}
});
imageBtn6.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fragMan = getFragmentManager();
FragmentTransaction fragTrans = fragMan.beginTransaction();
fragTrans.replace(R.id.fragment_place, new FragmentThree());
fragTrans.commit();
}
});
imageBtn5.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fragMan = getFragmentManager();
FragmentTransaction fragTrans = fragMan.beginTransaction();
fragTrans.replace(R.id.fragment_place, new FragmentThree());
fragTrans.commit();
}
});
imageBtn4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fragMan = getFragmentManager();
FragmentTransaction fragTrans = fragMan.beginTransaction();
fragTrans.replace(R.id.fragment_place, new FragmentThree());
fragTrans.commit();
//imageBtn4.setEnabled(false);
}
});
imageBtn3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fragMan = getFragmentManager();
FragmentTransaction fragTrans = fragMan.beginTransaction();
fragTrans.replace(R.id.fragment_place, new FragmentThree());
fragTrans.commit();
}
});
Button button_score = (Button)findViewById(R.id.scoreButton);
button_score.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intentPlay = new Intent(Play.this, ScoreActivity.class);
startActivity(intentPlay);
}
});
}
}
FragmentOne.java (это фрагмент немецкого флага)
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Context;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle;
import android.app.Fragment;
import android.preference.PreferenceManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TextView;
//import android.widget.TextView;
public class FragmentOne extends Fragment {
EditText theAnswer;
Button ScoreButton;
private EditText userAnswer;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.fragment_fragment_one, null);
userAnswer = (EditText)v.findViewById(R.id.editText);
final TextView tv = (TextView)v.findViewById(R.id.showCorrect);
final TextView hintv = (TextView)v.findViewById(R.id.textHint);
final Button submit = (Button)v.findViewById(R.id.submitBtn1);
submit.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
String theAnswer = (userAnswer.getText().toString());
if (theAnswer.equalsIgnoreCase("Germany")) {
//TextView tv = (TextView)v.findViewById(R.id.showCorrect);
tv.setText("Correct!");
} else {
}
submit.setEnabled(false);
// updateScore();
}
});
final Button skip = (Button)v.findViewById(R.id.skipBtn);
skip.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
submit.setEnabled(false);
}
});
final Button hint = (Button)v.findViewById(R.id.hintBtn);
hint.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
hintv.setText("The capital is Berlin \n The country is in Europe \n It starts with G... ");
//submit.setEnabled(false);
}
});
return v;
}
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
ScoreButton = (Button)getView().findViewById(R.id.scoreButton);
final SharedPreferences app_preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
ScoreButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
SharedPreferences.Editor editor = app_preferences.edit();
if (userAnswer.isChecked()){
editor.putInt("answer_value", 1);
}
else {
editor.putInt("answer_value", 0);
}
editor.commit();
}
});
}
}
.isChecked () отображается красным цветом. Нужно ли что-то импортировать?
3 ответа
Прежде всего: почему вы используете все эти фрагменты? Разве вы не можете использовать один фрагмент, обновляющий данные для чередования вопросов?
Проблема в том, что EditText
класс не имеет isChecked()
метод. Чтобы использовать этот метод, вам нужно использовать CheckBox
учебный класс.
Вы используете виджет, чтобы поймать пользовательский ввод, например, ввод текста HTML. Проверено - это логически свойство элемента, который можно проверить, например, флажок HTML
Вы помещаете текст в свой EditText (пользовательский ответ), а затем запрашиваете поле строкового контейнера, если оно отмечено. Это не имеет смысла.
Что вам действительно нужно, так это хранить, если пользовательский ответ соответствует правильному ответу (как в логическом). Вы можете установить это значение, когда вы установите "правильный" в результате TextView, примерно так:
final Button submit = (Button)v.findViewById(R.id.submitBtn1);
submit.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
String theAnswer = (userAnswer.getText().toString());
if (theAnswer.equalsIgnoreCase("Germany")) {
//TextView tv = (TextView)v.findViewById(R.id.showCorrect);
tv.setText("Correct!");
// keep trace of user answer result
wellAnswered = true;
} else {
}
submit.setEnabled(false);
// updateScore();
}
});
Затем вы можете обновить код FragmentOne следующим образом:
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
ScoreButton = (Button)getView().findViewById(R.id.scoreButton);
final SharedPreferences app_preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
ScoreButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
SharedPreferences.Editor editor = app_preferences.edit();
if (wellAnswered){
editor.putInt("answer_value", 1);
// remember to reset your variable for next question
wellAnswered = false;
}
else {
editor.putInt("answer_value", 0);
}
editor.commit();
}
});
}
Поэтому я изменил код в FragmentOne.java, и теперь он выглядит так:
public class FragmentOne extends Fragment {
private EditText userAnswer;
private boolean wellAnswered;
private Button ScoreButton;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.fragment_fragment_one, null);
userAnswer = (EditText)v.findViewById(R.id.editText);
final TextView tv = (TextView)v.findViewById(R.id.showCorrect);
final TextView hintv = (TextView)v.findViewById(R.id.textHint);
final Button submit = (Button)v.findViewById(R.id.submitBtn1);
submit.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
String theAnswer = (userAnswer.getText().toString());
if (theAnswer.equalsIgnoreCase("Germany")) {
//TextView tv = (TextView)v.findViewById(R.id.showCorrect);
tv.setText("Correct!");
wellAnswered = true;
} else {
}
submit.setEnabled(false);
// updateScore();
}
});
final Button skip = (Button)v.findViewById(R.id.skipBtn);
skip.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
submit.setEnabled(false);
}
});
final Button hint = (Button)v.findViewById(R.id.hintBtn);
hint.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
hintv.setText("The capital is Berlin \n The country is in Europe \n It starts with G... ");
//submit.setEnabled(false);
}
});
return v;}
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
ScoreButton = (Button)getView().findViewById(R.id.scoreButton);
final SharedPreferences app_preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
ScoreButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
SharedPreferences.Editor editor = app_preferences.edit();
if (wellAnswered){
editor.putInt("answer_value", 1);
// remember to reset your variable for next question
wellAnswered = false;
}
else {
editor.putInt("answer_value", 0);
}
editor.commit();
}
});
}
}
Я использовал предложения из ваших ответов и не получаю ошибок, однако приложение вылетает при нажатии на флажки. Есть идеи, что я делаю не так?
STACKTRACE:
01-06 20:08:18.152 3912-3912/? I/art: Not late-enabling -Xcheck:jni (already on)
01-06 20:08:18.153 3912-3912/? W/art: Unexpected CPU variant for X86 using defaults: x86
01-06 20:08:18.189 3912-3919/? I/art: Debugger is no longer active
01-06 20:08:18.189 3912-3919/? I/art: Starting a blocking GC Instrumentation
01-06 20:08:18.294 3912-3912/? W/System: ClassLoader referenced unknown path: /data/app/com.example.karolinawullum.quizapp-1/lib/x86
01-06 20:08:18.299 3912-3912/? I/InstantRun: Instant Run Runtime started. Android package is com.example.karolinawullum.quizapp, real application class is null.
[ 01-06 20:08:18.311 1560: 1583 D/ ]
HostConnection::get() New Host Connection established 0x8d661580, tid 1583
01-06 20:08:18.378 3912-3912/? W/System: ClassLoader referenced unknown path: /data/app/com.example.karolinawullum.quizapp-1/lib/x86
01-06 20:08:18.487 3912-3912/? W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
01-06 20:08:18.608 3912-3933/? I/OpenGLRenderer: Initialized EGL, version 1.4
01-06 20:08:18.610 3912-3933/? D/OpenGLRenderer: Swap behavior 1
01-06 20:08:18.637 3912-3933/? E/EGL_emulation: tid 3933: eglSurfaceAttrib(1174): error 0x3009 (EGL_BAD_MATCH)
01-06 20:08:18.637 3912-3933/? W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x90557900, error=EGL_BAD_MATCH
Чтобы сохранить результаты, вы можете использовать SharedPreferences
, Согласно документам:
Если у вас есть относительно небольшая коллекция значений ключей, которые вы хотите сохранить, вам следует использовать API SharedPreferences. Объект SharedPreferences указывает на файл, содержащий пары ключ-значение, и предоставляет простые методы для их чтения и записи. Каждый файл SharedPreferences управляется платформой и может быть закрытым или общим.
Как я использую SharedPreferences
сохранить мой счет?
Каждый раз, когда пользователь нажимает submit
кнопка, внутри onClickListener()
получить существующее значение из SharedPreferences
файл и увеличить его на единицу.
Итак, как мне это сделать?
Ну во-первых, создайте экземпляр SharedPreferences
:
private SharedPreferences sharedpreferences;
затем инициализируйте его:
sharedpreferences = getSharedPreferences("mypref", Context.MODE_PRIVATE);
затем внутри onClickListener()
:
SharedPreferences.Editor editor = sharedpreferences.edit();
editor.putInt("SCORE", sharedpreferences.getInt("SCORE",0)+1);
editor.apply();
Так что это делает, он создает пару ключ-значение, где ключ SCORE
, а также putInt()
метод вставляет значение, связанное с ключом, в этом случае SCORE
,
ПРИМЕЧАНИЕ: sharedpreferences.getInt("SCORE",0)+1)
то, что это делает, это увеличивает, счет на единицу. И наконец apply()
сохраняет данные в SharedPreferences
файл.
Как я могу получить счет?
sharedpreferences = getSharedPreferences("mypref", Context.MODE_PRIVATE);
int score = sharedpreferences.getInt("SCORE",0)
Где 0
это значение по умолчанию.
Надеюсь, поможет!