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を動的に変更できるようにしたい(たとえば、mMathMagではなくmMnemonicsから選択するように指示する)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設定の使用方法を示しているため、アプリにアタッチする前にテストするだけです。最後に、私は次のregarindの好みを検討します。

  • アクティビティの設定やレイアウトをカスタマイズするのが簡単なビューはどれですか?
  • 「サウンドを有効にする」のようにアプリに実際の設定を追加する場合は、それらをすべてまとめてパックする必要があります。ここに掲載されている図を読んでください

フラグメントを「使用する必要がある」ため、非推奨になりますが、最初は使用せずに試してください。ここから、メインアクティビティ(onCreate)を読み取り、演習を動的に生成します。

それが役に立てば幸い

于 2012-10-25T20:15:52.777 に答える