MainActivityのTextViewをインタフェース経由でMediaRecorderを拡張するクラスから更新しようとしましたが、動作しません。 findViewByIdメソッドは、レイアウトが拡張されたアクティビティでのみ動作しますが、なぜボタンOnClickListenerインターフェイスはfindViewByIdメソッドを完璧に使用していますか?だから私はこれができる方法があるかどうかを知りたい。インターフェイスを介して別のクラスからTextViewを更新するにはどうすればいいですか?
クラスのみの特定のセット(例えばビュー、ViewHolderなど)から参照を取得し、あなたがfindViewByIdを呼び出すためのもののいずれかが必要findviewByIdを呼び出すpublic class mediaa extends MediaRecorder {
Context c;
public mediaa(Context c) {
this.c = c;
}
interface AmplitudeListener {
void update(int i, TextView tv);
}
AmplitudeListener al;
public void setAmplitudeListener(AmplitudeListener al) {
this.al = al;
}
void updateAmplitude() {
View inflatedView = View.inflate(c, R.layout.main, null);
TextView tv = (TextView) inflatedView.findViewById(R.id.tv);
al.update(getMaxAmplitude(), tv);
}
@Override
public void start() throws IllegalStateException {
super.start();
handler.postDelayed(run, 500);
}
final Handler handler = new Handler();
Runnable run = new Runnable() {
@Override
public void run() {
updateAmplitude();
handler.postDelayed(this, 500);
}
};
@Override
public void stop() throws IllegalStateException {
super.stop();
}
@Override
public int getMaxAmplitude() throws IllegalStateException {
return super.getMaxAmplitude();
}
public class MainActivity extends Activity implements OnClickListener, AmplitudeListener {
mediaa m;
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.start:
m().start();
break;
case R.id.stop:
m().stop();
}
}
mediaa m() {
m = new mediaa(this);
m.setAudioSource(mediaa.AudioSource.MIC);
m.setOutputFormat(mediaa.OutputFormat.AAC_ADTS);
m.setAudioEncoder(mediaa.AudioEncoder.AAC);
m.setAudioEncodingBitRate(320000);
m.setAudioSamplingRate(44100);
m.setAmplitudeListener(this);
m.setOutputFile("/sdcard/Testt.m4a");
try {
m.prepare();
} catch (IOException e) {} catch (IllegalStateException e) {}
return m;
}
@Override
public void update(int i, TextView tv) {
try {
View inflatedView = new
MainActivity().getLayoutInflater().inflate(R.layout.main, null);
tv = (TextView) inflatedView.findViewById(R.id.tv);
tv.setText(i);
} catch (Exception e) {
Toast.makeText(this, "" + e, Toast.LENGTH_LONG).show();
}
}
public TextView getView(int i) {
TextView tv = (TextView) findViewById(i);
return tv;
}
Button start, stop;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
start = (Button) findViewById(R.id.start);
stop = (Button) findViewById(R.id.stop);
start.setOnClickListener(this);
stop.setOnClickListener(this);
}
}
コードを再フォーマットする必要があります。 – codecrazer