0

Android アプリのどこかで設計ミスをしていると思います。私の(簡略化された)コードを以下に貼り付けます。

MainActivity で writeMidi メソッドを使用しています。ただし、カスタムリスナーで「onItemSelected」がトリガーされたときに、それを使用したり、実際にトリガーしたりしたいと思います。

私はそれを行う方法について少し引き裂かれています。メイン アクティビティの customlistener に適合するように、このコードを再設計する必要がありますか?

助けてくれてありがとう。

public class MainActivity extends Activity{


    int song = 0;
    int[] music;
    public int instrument;
    public CustomOnItemSelectedListener listener;


    // *******************************************************
    // set Layout - on create
    // *******************************************************
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        instrument = 0;

        listener = new CustomOnItemSelectedListener();
        addListenerOnSpinnerItemSelection();

        //more stuff, including using the writeMidi method

};


    public void addListenerOnSpinnerItemSelection(){

        instrumentSp = (Spinner) findViewById(R.id.instrument);
        instrumentSp.setOnItemSelectedListener(listener);
    }


    public void writeMidi(int[] music, int count) {
        // so some stff
    }

}

および別のファイルで。

public class CustomOnItemSelectedListener implements OnItemSelectedListener {

    private int instrument = 0;

      public void onItemSelected(AdapterView<?> parent, View view, int pos,long id) {
        Toast.makeText(parent.getContext(), 
            "Please wait a minute for the instrument to be changed. ", Toast.LENGTH_SHORT).show();
         instrument = pos;

      }


      public int getInstrument(){
          return instrument;
      }

    }
4

4 に答える 4

1

メイン クラスでブロードキャスト レシーバーを使用し、さまざまなタイプのブロードキャスト (さまざまなメッセージ) を送信して、メイン アクティビティでさまざまなメソッドをアクティブにします。

于 2012-11-29T09:29:16.940 に答える
1

Listener インターフェイス 'InstrumentSelectedListener' などを作成できます。次に、MainActivity にそのインターフェイスを実装させ、それを CustomOnItemSelectedListener のリスナーとして登録し、onItemSelected で「writeMidiNow」イベントを発生させます。

次のような結果になります。

public class MainActivity extends Activity implements OnInstrumentSelectedListener{


int song = 0;
int[] music;
public int instrument;
public CustomOnItemSelectedListener listener;


// *******************************************************
// set Layout - on create
// *******************************************************
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    instrument = 0;

    listener = new CustomOnItemSelectedListener();
    addListenerOnSpinnerItemSelection();

    //more stuff, including using the writeMidi method

};


public void addListenerOnSpinnerItemSelection(){

    instrumentSp = (Spinner) findViewById(R.id.instrument);
    instrumentSp.setOnItemSelectedListener(listener);
}

public void onInstrumentSelected(int instrument) {
    //  do some stuff with the instrument.
}

public void writeMidi(int[] music, int count) {
    // so some stff
}

}

public class CustomOnItemSelectedListener implements OnItemSelectedListener {

public interface OnInstrumentSelectedListener{
    public void onInstrumentSelected(int instrument);
}

private int instrument = 0;
private OnInstrumentSelectedListener instrumentlistener;
  public void onItemSelected(AdapterView<?> parent, View view, int pos,long id) {
    Toast.makeText(parent.getContext(), 
        "Please wait a minute for the instrument to be changed. ", Toast.LENGTH_SHORT).show();
     instrument = pos;

     if(instrumentListener != null)
        instrumentListener.onInstrumentSelected(instrument);

  }

  public void setInstrumentListener(OnInstrumentSelectedListener listener) {
      this.instrumentListener = listener;
  }

  public int getInstrument(){
      return instrument;
  }

}
于 2012-11-29T09:29:51.183 に答える
0

提案されたいくつかの解決策を試しましたが、どれも完全に機能させることができませんでした。

だから私はこのような別のクラスを使用しないことでそれを解決しました:

instrumentSp.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {   
     public void onItemSelected(AdapterView<?> parent, View view, int pos,long id) {
于 2012-12-05T15:56:15.107 に答える
0

それを行う2つの方法:

-まず、クラスのコンテキストをMainActivityクラスに渡しますCustomOnItemSelectedListener

- 2 番目の方法は手早く汚いため、writeMidi()メソッドをstaticにしますが、アクセスできるのは のみstatic methodsであり、非静的メンバーではないことに注意してください。 static members

于 2012-11-29T09:31:47.310 に答える