2017-07-16 21 views
0

我一直试图从通过接口扩展MediaRecorder的类中更新MainActivity中的TextView,但它不工作。我知道findViewById方法只适用于布局已膨胀的Activity,但为什么Button OnClickListener接口完美地使用findViewById方法?所以我想知道是否有办法做到这一点。如何通过接口从另一个类更新TextView

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

你需要重新格式化你的代码! – codecrazer

回答

0

调用findviewById只得到由一组特定的类的引用(例如查看,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的引用,所以你把它作为一个参数。这是确保您避免异常的好方法(例如,您忘记设置View())

//Previous constructor completed 
    MyExampleClass(TextView tv){ 
     this.tv = tv; 
    } 

请在将来使用代码示例括号。真的很难通读你的代码。

+0

我对我的代码格式感到抱歉。但我想用一个接口来更新代码。 –

+0

这改变了情况。不建议使用接口来传递数据。请阅读此:http://www.sanfoundry.com/java-android-program-demonstrate-local-broadcast-manager/ – bemihai22

+0

我同意你的看法,但Button OnClickListener接口完美地执行任务。有没有我没有得到的东西?我可以使用另一种方法来传递数据,但是如果我想将它用作事件监听器呢? –

相关问题