2012-11-29 8 views
0

내 안드로이드 애플 리케이션에서 어딘가에 설계 오류가 있다고 생각합니다. 내 (단순화 된) 코드가 아래에 붙여 넣어집니다.MainActivity에서 다른 클래스의 메서드에 액세스

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; 
     } 

    } 

답변

0

나는 여러 가지 해결책을 시도했지만 완전히 작동하지는 못했습니다.

그래서 나는 다음과 같은 별도의 클래스를 사용하지 않음으로써 그것을 해결 :

instrumentSp.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
    public void onItemSelected(AdapterView<?> parent, View view, int pos,long id) { 
1

메인 클래스에서 브로드 캐스트 리시버를 사용하고 다른 유형의 브로드 캐스트 (다른 ​​메시지)를 보내어 주 활동에서 다른 방법을 활성화하십시오.

+0

좋아, 내가 그에 튜토리얼을 찾을 것입니다. – dorien

+0

별도의 클래스가 활동 컨텍스트에 액세스해야합니까? – dorien

+0

활동이 아닌 경우 해당 클래스에 응용 프로그램 컨텍스트를 전달하고 활동 인 경우 현재 활동의 컨텍스트를 사용하십시오. –

1

리스너 인터페이스 '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; 
    } 

} 
+0

Thanks. 그러나 writeMidi 메소드는 여전히 리스너에서 인식되지 않습니다. – dorien

0

을 할 수있는 2 가지 방법 :

- 먼저 MainActivity의 컨텍스트를 전달합니다 클래스를 CustomOnItemSelectedListener 클래스로 변경하십시오.

- 두 번째 방법은 신속하고 더러운, 정적writeMidi() 방법을,하지만 당신은 마음이 static methods액세스 전용static members, 비 정적하지 회원을 유지해야한다.

관련 문제