2012-10-23 46 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