来自类属性的android设置

时间:2012-10-23 15:58:48

标签: android settings android-preferences

我有一些问题试图找出这个:我有一组抽象类(练习)的实例,它处理单个练习,以及一组包含特定练习的其他类(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元素并处理它。

如何做到这一点? 谢谢!

1 个答案:

答案 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偏好:

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

由于您“应该”使用片段,因此弃用是存在的,但首先尝试不使用片段。 从这里开始,只需在主要活动中读取首选项(onCreate)并动态生成练习。

希望有所帮助