2012-03-02 87 views
0

我正在制作应用程序,以测量基于麦克风输入噪声的风速。噪音和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); 
    } 
} 
+0

你看过这些主题? 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

回答

0

使用你的逻辑。

// (R.id.empty)  Replace with your TextView id. 
TextView amptv = (TextView) findViewById(R.id.amptv); 
amptv.setText(newAmplitude); 

在您想要设置值的类的单独区域中,创建对象的实例。然后通过setText()设置值。这对你来说可以正常工作。

0

充分利用OnClickListener一个内部类的Vumeter(你应该使用类大写字母标识符),那么你就可以访问该字段amptvVumeter这样的:

Vumeter.this.amptv.setText(Double.toString(Vumeter.this.newAmplitude)); 

this将是OnClickListenerVumeter.thisVumeter的外部实例。

+0

什么你的意思是把它作为一个内部类,onclicklistener必须在类RecordButton之外。我插入了你给我的当前代码的方法,当我再次按下recordbutton停止录制时出现错误。我的新代码位于此页面的顶部。 – Stiloboy 2012-03-03 13:33:45

+0

现在,它是一个(匿名的,意味着它没有名字)内部类。这是因为它是在RecordButton类中定义的。但是,amptv和newAmplitude是在vumeter中定义的,而不是在RecordButton中。因此,您必须在vumeter类中设置侦听器。之后检查你是否仍然需要RecordButton类。 – Stefan 2012-03-03 14:23:48