setText в другом классе - Android

Я делаю приложение для измерения скорости ветра на основе шума микрофонного входа. Запись шума и расчет в децибеллах работают нормально. Я хочу отобразить значение newAmplitude в TextView с именем amptv. Он отображает только 0, потому что newAmplitude равен 0 на onCreate. Как я могу изменить текст TextView на значение newAmplitude после того, как я нажму кнопку остановки записи?

Поскольку onclicklistener находится в своем собственном классе, мне не удается сделать это только с помощью amptv.setText (newAmplitude);

Это последнее, что я пробовал, пробовал и другие вещи, но они тоже не сработали.

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, и я действительно застрял в банкомате.

Это моя вторая попытка, все еще получаю сообщение об ошибке, когда нажимаю кнопку остановки записи.

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

person Stiloboy    schedule 02.03.2012    source источник
comment
Вы смотрели эти темы? stackoverflow.com/questions/1021167/refresh-a-view-android stackoverflow.com/questions/4503458 /   -  person Alex    schedule 02.03.2012


Ответы (2)


Используйте свою логику вот так.

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

В отдельной области класса, где вы хотите установить значение, создайте экземпляр объекта. затем установите значение с помощью setText (). Это точно подойдет вам.

person Hamza Waqas    schedule 02.03.2012

Сделайте OnClickListener внутренним классом Vumeter (вы должны использовать идентификаторы верхнего регистра для классов), тогда вы можете получить доступ к полю amptv из Vumeter следующим образом:

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

this будет OnClickListener, Vumeter.this - внешний экземпляр Vumeter.

person Stefan    schedule 02.03.2012
comment
Что именно вы имеете в виду, делая его внутренним классом, должен ли onclicklistener находиться вне класса RecordButton. Я вставил указанный вами метод в свой текущий код, у меня возникла ошибка, когда я снова нажал кнопку записи, чтобы остановить запись. мой новый код находится наверху этой страницы. - person Stiloboy; 03.03.2012
comment
Теперь это (анонимный, что означает, что у него нет имени) внутренний класс в вашем коде. Это потому, что он определен внутри класса RecordButton. Однако amptv и newAmplitude определены в vumeter, а не в RecordButton. Таким образом, вы должны установить слушателя в классе vumeter. После этого проверьте, нужен ли вам класс RecordButton. - person Stefan; 03.03.2012