0

我在试图弄清楚这一点时遇到了一些问题:我有一组处理单个练习的抽象类 (Exercise) 的实例,以及一组包含特定练习的其他类 (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) 2) 从特定 TraningClass 中选择哪个练习。设置,例如,mMathMag 是否可以选择练习类型 TwoDigitsX11 3) 更改特定练习的等待时间(访问函数 setWaitingTime() )

我的问题是我无法制作一组特定的变量来处理这个问题,因为我希望能够添加或删除特定的培训课程和练习,所以理想情况下,应用程序应该能够从设置页面访问 mTrainingClasses 元素并处理它。

如何才能做到这一点?谢谢!

4

1 回答 1

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 指南。请注意,您可以在此处对元素进行分类,这样您就可以将 MatheMagic、助记符和所有您的东西作为类别。

顺便说一句,这是整个代码。因为这个答案展示了如何使用 android 首选项,所以您可以在将其附加到您的应用程序之前对其进行测试。最后,我会考虑以下方面的偏好:

  • 哪个视图更容易自定义活动的首选项或布局?
  • 如果您想为您的应用添加实际偏好,例如:“启用声音”,您必须将它们全部打包在一起。阅读此处发布的图表

不赞成使用是因为您“应该”使用片段,但首先尝试不使用。从这里,只需在您的 mainactivity 中读取首选项(onCreate)并动态生成练习。

希望能帮助到你

于 2012-10-25T20:15:52.777 回答