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 это значение по умолчанию.


Надеюсь, поможет!

Другие вопросы по тегам