【问题标题】:android settings from class properties来自类属性的 android 设置
【发布时间】:2012-10-23 15:58:48
【问题描述】:

我在试图弄清楚这一点时遇到了一些问题:我有一组处理单个练习的抽象类 (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 元素并处理它。

如何做到这一点? 谢谢!

【问题讨论】:

  • 大卫,当您说“设置页面”时,您到底在想什么?您是否希望此设置成为持久的应用程序数据并作为用户的首选项进行访问?
  • 希望你问的是什么

标签: android settings android-preferences


【解决方案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 首选项,因此您可以在将其附加到您的应用之前对其进行测试。最后,我会考虑以下方面的偏好:

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

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

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多