Android Studio问答应用程序保存分数
我目前正在制作一个旗帜测验应用程序,并希望添加分数。下面你可以看到它的图片;每个标志都是一个片段,当您按下它们时,右侧允许您提交答案 当您输入正确答案时,将显示一条“正确”消息,您可以转到下一个标志。我想要一个正确的答案给1分,而一个错误的答案(或者当按下“跳过”或“提示”时)给0分。最后,对分数进行了总结。然而,我不确定如何做到这一点。我已经创建了一个ScoreActivity.java文件,其中将注册分数(尽管它当前为空),并且我已经尝试编写如下所示的代码 Play.javaAndroid Studio问答应用程序保存分数,android,android-layout,android-studio,android-framelayout,Android,Android Layout,Android Studio,Android Framelayout,我目前正在制作一个旗帜测验应用程序,并希望添加分数。下面你可以看到它的图片;每个标志都是一个片段,当您按下它们时,右侧允许您提交答案 当您输入正确答案时,将显示一条“正确”消息,您可以转到下一个标志。我想要一个正确的答案给1分,而一个错误的答案(或者当按下“跳过”或“提示”时)给0分。最后,对分数进行了总结。然而,我不确定如何做到这一点。我已经创建了一个ScoreActivity.java文件,其中将注册分数(尽管它当前为空),并且我已经尝试编写如下所示的代码 Play.java import
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(这是德国国旗的片段)
.isChecked()显示为红色。我需要导入一些东西吗?首先:为什么要使用所有这些片段?你不能用一个片段来更新它的数据来在问题之间交替吗 问题是,
EditText
类没有isChecked()
方法。
要使用该方法,您需要使用复选框
类
您正在使用小部件捕捉用户输入,如文本类型。
Is checked是逻辑上可以检查的项的属性,如
您正在将文本放入EditText(用户答案)中,然后询问是否选中了字符串容器字段。这没有道理
您真正需要的是存储用户答案是否匹配正确答案(如布尔值)。您可以在结果文本视图中设置“正确”时设置此值,如下所示:
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();
}
});
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();
}
});
}
}
然后,您可以按如下方式更新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();
}
});
}
要保存分数,您可以使用
SharedReferences
。根据文件:
如果要保存的键值集合相对较小,则应使用SharedReferences API。SharedReferences对象指向一个包含键值对的文件,并提供简单的读写方法。每个SharedReferences文件都由框架管理,可以是私有的,也可以是共享的
如何使用SharedReferences
存储我的分数?
sharedpreferences = getSharedPreferences("mypref", Context.MODE_PRIVATE);
int score = sharedpreferences.getInt("SCORE",0)
每次用户单击submit
按钮时,在onClickListener()中
从SharedReferences
文件中检索现有值并将其递增一
那么,我该怎么做呢?
sharedpreferences = getSharedPreferences("mypref", Context.MODE_PRIVATE);
int score = sharedpreferences.getInt("SCORE",0)
首先,创建一个SharedReferences
的实例:
private SharedPreferences sharedpreferences;
然后初始化它:
sharedpreferences = getSharedPreferences("mypref", Context.MODE_PRIVATE);
然后在onClickListener()中:
这样做的目的是,它创建一个键值对,其中键是SCORE
,并且putInt()
方法插入一个与键相关的值,在本例中是SCORE
注意:SharedReferences.getInt(“SCORE”,0)+1)
这样做的目的是将分数增加1。最后,apply()
将数据保存到SharedReferences
文件中
如何检索分数?
sharedpreferences = getSharedPreferences("mypref", Context.MODE_PRIVATE);
int score = sharedpreferences.getInt("SCORE",0)
其中,0
是默认值。
希望有帮助 所以我修改了FragmentOne.java中的代码,现在看起来是这样的:
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();
}
});
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();
}
});
}
}
我已经使用了你的答案中的建议,我没有收到任何错误,但是,当我按下标志时,应用程序崩溃。知道我做错了什么吗
堆栈跟踪:
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
我该怎么做?@KaraW如果我是你,我会从这里开始:@firefolves我根据你的建议更改了代码,并将其发布在下面。但现在应用程序正在崩溃。我遗漏了什么?把你的追踪贴出来please@firegloves我已经把它贴在我下面的帖子里了。如果不是正确的,请告诉我。1)当某些内容以红色突出显示时,您应该会在Android Studio中看到错误。2) 我会使用editText.setTag(score)
或检查答案并将布尔值传递给save函数,或在活动中保留score变量。3) 您每次都用0或1覆盖相同的SharedReferences
键,而不是添加到ScoreAAH我可以看到您的逻辑!只是有点不确定我应该把这些不同的部分放在我的代码中的什么地方,以及我应该删除现有代码的哪些部分。我无法理解你的stacktrace。尝试清理和删除生成文件夹,或从“文件”菜单中选择“无效缓存/重新启动”。难道你没有一行stacktrace,上面写着由代码的某行引起或指向代码的某行吗?但是,使用不同的片段可以提高性能complexity@firegloves然而,SharedPreferences.java文件(保存分数的地方)几乎是空的。我需要添加一些代码吗?