4

Java と Android を学んで愛用していますが、道のりは長いです。これはベストプラクティスの質問だと思います。私の Android アクティビティには 6 つのクラスがあります。それらのいくつかは、別のクラスから複製したメソッドを呼び出しています。メソッドを別のクラスから呼び出すことができるのに、メソッドを複製するのは冗長に思えます。また、それらすべてを 1 つのクラスで管理する方が簡単だと思います。(主な活動でしょうか?) 私の質問は: 複数のクラスから同じメソッドを呼び出すためのベスト プラクティスは何ですか? たとえば、私のクラスは次のとおりです。

メイン アクティビティ GameSelector Game1Home Game1

すべてのクラスで同じメソッドがいくつかあります。それらを getPrefs() および setPrefs() と呼びましょう。私はそれらに何も渡していません。それらはどのクラスに入る必要があり、別のクラスからどのように呼び出すことができますか?

編集 - いくつかの非常に役立つ回答のおかげで、完全に機能する Configurations クラスがあり、他の 6 つのクラスははるかにきれいに見えます! これは維持するのが非常に簡単で、作成中にいくつかの優れた指針を学びます. 他の誰かに役立つかもしれない場合に備えて、完成したクラスをここに投稿しています。次のように、他のクラスからメソッドを呼び出すことができます。

Configurations.getPrefs(this);

次のように、構成ファイルでグローバルとして定義した静的変数を参照します。

Configurations.buttonClicked.start();

Configurations.java:

public class Configurations extends Activity {
static MediaPlayer buttonClicked;
static MediaPlayer instructionsAudio;
static MediaPlayer messageAudio;
static MediaPlayer correctNum_sound;
static MediaPlayer incNuma_sound;
static MediaPlayer incNumb_sound;
static String storeChildsName;
static String storeRequestedRange;
static String storeVoiceChoice;
static Intent i;


public static void setupPrefs(final Activity a) {
    ImageButton settingsClicked = ((ImageButton) a.findViewById(R.id.prefButton));
    settingsClicked.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                ImageView settingsClicked = ((ImageView) a.findViewById(R.id.prefButton));
                    settingsClicked.setImageResource(R.drawable.settings_button_clicked);
                buttonClicked = MediaPlayer.create(a, R.raw.click);
                    buttonClicked.start();

                    Intent settingsActivity = new Intent(a.getBaseContext(),
                                    Preferences.class);
                    a.startActivity(settingsActivity);
            }
    });
}
public static void getPrefs(final Activity a) {
    // Get the xml/preferences.xml preferences
    SharedPreferences prefs = PreferenceManager
                    .getDefaultSharedPreferences(a.getBaseContext());
    storeChildsName = prefs.getString("editTextPref",
                    "Friend");
    storeRequestedRange = prefs.getString("listPref", "3");
    storeVoiceChoice = prefs.getString("voices", "1");
}

public static void setupMusicToggle(final Activity a) {
    i=new Intent(a, MyMusicService.class);
       final ToggleButton togglebutton =(ToggleButton)a.findViewById(R.id.music_toggle);
      togglebutton.setOnClickListener(new OnClickListener() {  
          public void onClick(View v) {   
              // Perform action on clicks    
              if (togglebutton.isChecked()) {   
                  Toast.makeText(a, "Music on.", Toast.LENGTH_SHORT).show();  
                  a.startService(i);  
              } else {   
                  a.stopService(i);
                  Toast.makeText(a, "Music off.", Toast.LENGTH_SHORT).show(); 
                      }    }}); 
}

public static void returnHome(View view, Activity a) {
    ImageView homeClicked = (ImageView) a.findViewById(R.id.home);
    homeClicked.setImageResource(R.drawable.homebuttonclicked);
    buttonClicked = MediaPlayer.create(a, R.raw.click);
    buttonClicked.start();
    Intent intent = new Intent(a, GameSelector.class);
    a.startActivity(intent);
}

public static void releaseMP(Activity a) {
    if (buttonClicked != null) {
        buttonClicked.stop();
        buttonClicked.release();}
        if (instructionsAudio != null) {
            instructionsAudio.stop();
            instructionsAudio.release();}
        if (messageAudio != null) {
            messageAudio.stop();
            messageAudio.release();
        }
        if (correctNum_sound != null){
            correctNum_sound.stop();
            correctNum_sound.release();
        }
        if (incNuma_sound != null) {
            incNumb_sound.stop();
            incNuma_sound.release();
        }
        if (incNumb_sound !=null) {
            incNumb_sound.stop();
            incNumb_sound.release();
        }
}

public static boolean isMyServiceRunning(Activity a) {
    ActivityManager manager = (ActivityManager) a.getSystemService(Context.ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
        if (MyMusicService.class.getName().equals(service.service.getClassName())) {
            return true;
        }
    }
    return false;
}

}

これが私を助けたのと同じくらい誰かを助けることを願っています!

PS - このコードに改善の余地がある場合は、共有してください。学ぶことがたくさんあります =)

4

4 に答える 4

7

コードを共有するにはいくつかの方法があります。

  1. 「ヘルパー」クラスを定義し、それにstaticメソッドを追加すると、
  2. 基本クラス (多くの場合、抽象基本クラス) を定義し、それにメソッドを追加します。
  3. 非静的クラスを定義し、コードを共有する必要がある各クラスにそのクラスのインスタンスを埋め込む。クラスは、共通のインスタンスへの参照を共有することもできます。

どちらのアプローチがより適切かを言うのは難しいですが、メソッド名から、プリファレンスを取得して設定することを計画しているように見えます。そのような状況では、多くの場合、共有インスタンスを持つ #1 または #3 が最も適切です。

于 2013-08-13T02:15:26.877 に答える
1

それは、各メソッドが何をするかによって異なります。名前からして、getPrefs()ある種の環境設定のように見えます。その場合、私が個人的に行っているのは、クラスConfigurationを作成し、すべてのクラスが共有するシングルトン インスタンスを作成することです。

Android は通常の Java とは少し異なります。
「通常の」Java では、オブジェクトをインスタンス化し、それらへの参照を取得してから、それらのメソッドを呼び出します。
Android では、ほとんどのメソッドは 、 、 などで定義されてActivityおりFragmentDialogFragmentそれらのインスタンス化を制御することはできません。これらで定義されたメソッドは、宣言されていない限り、そのメソッド内でのみ呼び出すことができますstatic

したがって、設計を調べて、メソッドが何をするかを見て、それらから別のクラスを作成できるかどうかを確認してください:)
それが役に立てば幸いです.

于 2013-08-13T02:14:45.187 に答える
1

それはすべて、定義するクラスとメソッドの唯一の目的に依存します。

多くのアクティビティで使用する必要があるメソッドが多すぎる場合、1 つのオプションは次のようになります。

  1. 別のヘルパー クラスを定義し、そこにそれらのメソッドを実装します。必要なすべてのクラスにそれらを含めます。
  2. 継承またはインターフェイスは、2 番目のオプションです。
于 2013-08-13T02:17:08.563 に答える