2017-07-16 9 views
0

MainActivityのTextViewをインタフェース経由でMediaRecorderを拡張するクラスから更新しようとしましたが、動作しません。 findViewByIdメソッドは、レイアウトが拡張されたアクティビティでのみ動作しますが、なぜボタンOnClickListenerインターフェイスはfindViewByIdメソッドを完璧に使用していますか?だから私はこれができる方法があるかどうかを知りたい。インターフェイスを介して別のクラスからTextViewを更新するにはどうすればいいですか?

クラスのみの特定のセット(例えばビュー、ViewHolderなど)から参照を取得し、あなたがfindViewByIdを呼び出すためのもののいずれかが必要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); 
    } 
} 
+2

コードを再フォーマットする必要があります。 – codecrazer

答えて

0

また、あなたのアクティビティの参照をいつものように取得し、必要な他のクラスに渡すこともできます。コンストラクタを構築する際には、パラメータとして渡すよう

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

あなたは例外を避けることを確認するための良い方法です。あなたのコードを読むのは本当に難しいです。

+0

コードの書式設定には申し訳ありません。しかし、私はコードを更新するためにインターフェイスを使用したい。 –

+0

これにより状況が変わります。インターフェイスを使用してデータを渡すことはお勧めできません。これを読んでください:http://www.sanfoundry.com/java-android-program-demonstrate-local-broadcast-manager/ – bemihai22

+0

私はあなたに同意しますが、ボタンのOnClickListenerインターフェイスは完全にタスクを実行します。私には得られないことがありますか?別の方法でデータを渡すことはできますが、イベントリスナーとして使用する場合はどうすればいいですか? –

関連する問題