[英]How can I update a TextView from another class via an interface
我一直在嘗試從通過接口擴展MediaRecorder的類中更新MainActivity中的TextView,但該類不起作用。 我知道findViewById方法僅適用於布局已被放大的Activity,但是為什么Button OnClickListener接口可以完美地使用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);
}
}
調用findviewById僅從一組特定的類(例如View,ViewHolder等)中獲取引用,並且您需要其中一個才能調用findViewById。
您還可以照常在活動中獲取參考,並將其傳遞給所需的其他任何類。 這是一個例子:
public class MainActivity extends AppCompatActivity {
private TextView myTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myTextView = (TextView) findViewById(R.id.<EXAMPLE_ID>);
MyExampleClass class = new MyExampleClass();
class.setView(myTextView);
class.<EXAMPLE_ACTION>();
}
//// ExampleClass
public class MyExampleClass{
TextView tv;
//Empty Constructor Example
MyExampleClass(){
}
public void setView(TextView tv){
this.tv = tv;
}
public void exampleMethod(){
tv.setText("asd");
}
}
在構造構造函數時,您還可以獲得此TextView的引用,因此您可以將其作為參數傳遞。 這是確保避免異常的好方法(例如,您忘記了setView())
//Previous constructor completed
MyExampleClass(TextView tv){
this.tv = tv;
}
以后請使用代碼示例括號。 真的很難閱讀您的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.