我正在制作应用程序,以测量基于麦克风输入噪声的风速。噪音和calculatoin记录到Decibells工作正常。我想在一个名为amptv的TextView中显示newAmplitude的值。它仅显示0,因为onCreate上的newAmplitude为0。 如何将TextView的文本更改为newAmplitude的值,然后我点击停止记录按钮?由于onclicklistener是在它自己的类,我不能设法做到这一点amptv.setText(newAmplitude);因为onclicklistener是在它自己的类,我不能设法做到这一点只与amptv.setText(newAmplitude);setText在另一个类 - Android
这是我试过的最后一件事,也尝试了一些其他的东西,但他们都没有制定出来。
public class vumeter extends Activity {
private static final String LOG_TAG = "AudioRecordTest";
protected static final String TAG = null;
private static String mFileName = null;
private RecordButton mRecordButton = null;
private MediaRecorder mRecorder = null;
private PlayButton mPlayButton = null;
private MediaPlayer mPlayer = null;
private Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
currentAmplitude = mRecorder.getMaxAmplitude();
Log.i(TAG, "handleMessage : MaxAmplitude : " + currentAmplitude);
newAmplitude = 20 * Math.log(currentAmplitude);
Log.i(TAG, "nieuwe amplitude : " + newAmplitude);
}
};
private Timer timer = new Timer();
private TimerTask timerTask = null;
private int currentAmplitude;
private double newAmplitude = 5.0;
public TextView amptv;
private void onRecord(boolean start) {
if (start) {
startRecording();
} else {
stopRecording();
}
}
private void onPlay(boolean start) {
if (start) {
startPlaying();
} else {
stopPlaying();
}
}
private void startPlaying() {
mPlayer = new MediaPlayer();
try {
mPlayer.setDataSource(mFileName);
mPlayer.prepare();
mPlayer.start();
} catch (IOException e) {
Log.e(LOG_TAG, "prepare() failed");
}
}
private void stopPlaying() {
mPlayer.release();
mPlayer = null;
}
private synchronized void startRecording() {
if (mRecorder == null) {
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setOutputFile(mFileName);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
}
try {
mRecorder.prepare();
} catch (IOException e) {
Log.e(LOG_TAG, "prepare() failed");
}
mRecorder.start();
timer.schedule(timerTask = new TimerTask() {
@Override
public void run() {
mHandler.sendEmptyMessage(0);
}
}, 250, 250);
}
private synchronized void stopRecording() {
if (timerTask != null) {
timerTask.cancel();
timerTask = null;
}
mRecorder.stop();
mRecorder.release();
mRecorder = null;
}
class RecordButton extends Button {
boolean mStartRecording = true;
OnClickListener clicker = new OnClickListener() {
public void onClick(View v) {
onRecord(mStartRecording);
if (mStartRecording) {
setText("Stop measuring");
} else {
setText("Start measuring");
amptv.setText(newAmplitde);
}
mStartRecording = !mStartRecording;
}
};
public RecordButton(Context ctx) {
super(ctx);
setText("Start measuring");
setOnClickListener(clicker);
}
}
class PlayButton extends Button {
boolean mStartPlaying = true;
OnClickListener clicker = new OnClickListener() {
public void onClick(View v) {
onPlay(mStartPlaying);
if (mStartPlaying) {
setText("Stop playing");
} else {
setText("Start playing");
}
mStartPlaying = !mStartPlaying;
}
};
public PlayButton(Context ctx) {
super(ctx);
setText("Start playing");
setOnClickListener(clicker);
}
}
public vumeter() {
mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
mFileName += "/audiorecordtest.3gp";
}
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
LinearLayout ll = new LinearLayout(this);
mRecordButton = new RecordButton(this);
ll.addView(mRecordButton, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, 0));
mPlayButton = new PlayButton(this);
ll.addView(mPlayButton, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, 0));
TextView amptv = new TextView(this);
ll.addView(amptv, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, 0));
amptv.setText(Double.toString(newAmplitude));
setContentView(ll);
}
@Override
public void onPause() {
super.onPause();
if (mRecorder != null) {
mRecorder.release();
mRecorder = null;
}
if (mPlayer != null) {
mPlayer.release();
mPlayer = null;
}
}
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.my_options_menu, menu);
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.help:
startActivity(new Intent(this, InfoMeter.class));
return true;
default:
return super.onOptionsItemSelected(item);
}
}
希望有人可以帮助我,我是一个初学者与Java和即时通讯真的卡住atm。
这是我的第二次尝试,当我点击停止记录按钮时仍然出现错误。
class RecordButton extends Button {
boolean mStartRecording = true;
OnClickListener clicker = new OnClickListener() {
public void onClick(View v) {
onRecord(mStartRecording);
if (mStartRecording) {
setText("Stop measuring");
} else {
setText("Start measuring");
vumeter.this.amptv.setText(Double.toString(vumeter.this.newAmplitude));
}
mStartRecording = !mStartRecording;
}
};
public RecordButton(Context ctx) {
super(ctx);
setText("Start measuring");
setOnClickListener(clicker);
}
}
你看过这些主题? http://stackoverflow.com/questions/1021167/refresh-a-view-android http://stackoverflow.com/questions/4503458/update-view-at-runtime-in-android – Alex 2012-03-02 15:30:44