2012-10-23 43 views
0

我有一些问题试图找出这个问题:我有一组抽象类(练习),它处理单个练习的实例,和一组其他类(Traning类)的实例包含具体练习。从类属性的Android设置

我的应用程序选择一个随机的培训课程,然后运行一个随机的练习。从设置,我希望能够选择例如培训班和行使从随机选择使用哪个

这里是我的代码

/** 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元素并处理它。

这怎么办? 谢谢!

+0

大卫,你到底心里有当你说“设置页面”?您是否希望将此设置作为持久性应用程序数据并按照用户的偏好进行访问? – quinestor

+0

这将是主意,是 – DavidTonarini

+0

希望它是你问的 – quinestor

回答

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> 

可以持有多布尔多,刚读有关偏好的。请注意,您可以在这里对元素进行分类,以便您可以将MatheMagic,助记符和所有内容作为类别。

这是顺便说一句,整个代码 ..因为这个答案显示了如何使用android偏好,所以你可以在将它附加到你的应用程序之前测试它。最后,我会考虑以下regarind的偏好:

  • 哪个视图更容易自定义首选项或活动的布局?
  • 如果您想将实际偏好设置放入您的应用中,请执行以下操作:“启用声音”,您必须将它们全部打包在一起。阅读关系图here

由于您“应该”使用碎片,但首先不使用碎片。 从这里,刚刚看了你的mainactivity偏好(的onCreate)和动态生成的练习..

希望它可以帮助

+0

谢谢,非常有用 – DavidTonarini