我有一些问题试图找出这个:我有一组抽象类(练习)的实例,它处理单个练习,以及一组包含特定练习的其他类(Traning Class)的实例。
我的应用程序选择随机训练课程,然后从中进行随机练习。从设置中,我希望能够选择例如哪些培训课程以及随机选择使用的练习
这是我的代码
/** Common interface for all exercises */
public interface Exercise {
public Exercise run();
}
public abstract class ExerciseClass implements Exercise {
private int mWaitingTime = 3; //seconds to wait before answer is shown
private String mQuestion = "";
private String mAnswer = "";
private String mHint = "";
/*Getters and setters follow*/
}
这是特定训练课的一个例子,其中添加了练习
public class MatheMagic extends TrainingClass {
public MatheMagic() {
class TwoDigitsX11 extends ExerciseClass {
public ExerciseClass run() {
String[] aRes = new String[3];
/*Choose a two digit number*/
int aRand = RandInt(100,11);
String aQuestion = aRand + " x 11";
String aAnswer = String.valueOf(aRand * 11);
String aHint = "To multiply by 11, take the first digit and the last digit, and put in the middle the sum of the two. I.E. 36 x 11 = 3 (3+6) 6 -> 396";
this.setQuestion(aQuestion);
this.setAnswer(aAnswer);
this.setHint(aHint);
return this;
}
}
//Set specific waiting times
TwoDigitsX11 aTwoDigitsX11 = new TwoDigitsX11();
aTwoDigitsX11.setWaitingTime(5);
//Add exercises to training class
mExerciseTypes.add(aTwoDigitsX11);
//these are other examples of exercises, whose code I’ve now not included
mExerciseTypes.add(aMultiplicationTables);
mExerciseTypes.add(new SquareTwoDigitsEndingFive ());
}
}
现在,在我的主要活动中,我有:
private ArrayList<TrainingClass> mTrainingClasses ;
mMathMag = new MatheMagic();
mMnemonics = new Mnemonics();
mTrainingClasses = new ArrayList<TrainingClass>();
mTrainingClasses.add(mMathMag);
mTrainingClasses.add(mMnemonics);
然后,正如我所说,我有一个函数runRandomExercise,它从mTrainingClasses中选择一个随机元素,然后从其中的ExerciseClass数组列表中选择一个随机元素
从我的设置中,我希望能够 1)动态更改ArrayList(例如,我要从mMnemonics而不是mMathMag中选择的telle) 2)选择在特定TraningClass中选择的练习。例如,如果mMathMag可以选择锻炼类型TwoDigitsX11,则设置 3)更改特定练习的等待时间(访问函数setWaitingTime())
我的问题是我无法创建一组特定变量来处理这个问题,因为我希望能够添加或删除特定的培训课程和练习,所以理想情况下应用程序应该能够从设置页面访问mTrainingClasses元素并处理它。
如何做到这一点? 谢谢!
答案 0 :(得分:1)
这个问题的答案相当广泛,所以这里只有如何从偏好中读取的答案:
您不需要使用Android设置。您可以使用包含用户选择的活动,并将结果返回到练习中的活动。您需要实现数据持久性(dB),但是如果您想保留它们。 这是设计问题
要使用android的设置,请考虑以下主要活动:
public class MainActivity extends FragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView myText = new TextView(this);
SharedPreferences mySharedPref = PreferenceManager.getDefaultSharedPreferences(this);
String text = ((Boolean)mySharedPref.getBoolean("checkbox1", true)).toString()+" <- checkbox 1";
myText.setText(text);
setContentView(myText);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0, 0,0, R.string.hello_world);
return true;
}
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
Intent i = new Intent("com.example.testdialogfragment.SettingsActivity");
startActivity(i); // <------ Call settings as an activity
return super.onMenuItemSelected(featureId, item);
}
}
请注意如何调用设置活动以及如何读取其值,在这种情况下,它是onCreate中的checkbox1(布尔值)。为了能够解决此类意图,您需要在清单中声明设置活动:
//.... all the manifest..
<activity
android:name=".SettingsActivity"
android:label="settings"
android:theme="@android:style/Theme.Black">
<intent-filter>
<action android:name="com.example.testdialogfragment.SettingsActivity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
首选项活动如下:
public class SettingsActivity extends PreferenceActivity {
@SuppressWarnings("deprecation")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
}
最后,且最重要您的偏好xml必须进行分类,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:title="Exercise Category1"
android:key="pref_key_storage_settings">
<CheckBoxPreference
android:key="checkbox1"
android:title="checkbox1"
android:summary="summary"
android:defaultValue="true" />
<CheckBoxPreference
android:key="checkbox2"
android:title="checkbox1"
android:summary="summary"
android:defaultValue="true" />
</PreferenceCategory>
<PreferenceCategory
android:title="Exercise Category2"
android:key="pref_key_storage_settings">
<CheckBoxPreference
android:key="checkbox3"
android:title="checkbox3"
android:summary="summary"
android:defaultValue="true" />
</PreferenceCategory>
</PreferenceScreen>
您可以持有超过布尔值,只需阅读有关偏好的android's guide。请注意,您可以在此处对元素进行分类,以便您可以将MatheMagic,助记符和所有内容作为类别。
这是整个代码顺便说一下..因为这个答案显示了如何使用Android偏好设置,所以你可以在将它附加到你的应用程序之前测试它。最后,我会考虑以下的regarind偏好:
由于您“应该”使用片段,因此弃用是存在的,但首先尝试不使用片段。 从这里开始,只需在主要活动中读取首选项(onCreate)并动态生成练习。
希望有所帮助