簡體   English   中英

如何通過接口從另一個類更新TextView

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM