2017-06-10 10 views
0

私は私の活動のレイアウトにボタンを追加する機能を持っている:タイマーでレイアウト上のビューを追加 - Androidの

void addLeftButton() { 
    Button btn = new Button(this); 
    int height = 200; 
    int width = 300; 
    btn.setLayoutParams(new LinearLayout.LayoutParams(width, height)); 
    btn.setTag(10); 
    RelativeLayout layout = (RelativeLayout) findViewById(R.id.activity_main); 
    layout.addView(btn); 
} 

私はこのようなタイマーでこの関数を呼び出す:いくつかの理由から

Timer t = new Timer(); 
    t.scheduleAtFixedRate(new TimerTask() { 
     @Override 
     public void run() { 
      addLeftButton(); 
     } 
    },0,10); 

アプリはすぐに起動して停止します。 onCreateからボタン機能を1回呼び出すと、ボタンが期待どおりに追加されます。

タイマーで呼び出す理由は何ですか?

+0

LogCatのエラーメッセージを参照してください。私の推測では、非UIスレッドからUIを変更することはできません。 – nbokmans

+0

アプリケーションが停止すると、どのような種類の例外/ログが表示されますか? Timerをどこで作成していますか?レイアウトを拡張する前に作成してfindViewByIdをnullにすることは可能でしょうか? – merterpam

+0

@merterpam - 私はタイマー "onCreate"メソッドを作成します。 – Joe

答えて

0

nbokmansが正しいと思うのは、UI以外のスレッドからUI要素を変更しようとするためです。 Timerではなく、runOnUiThread

final Handler mHandler = new Handler(); 
    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 

      Button btn = new Button(StartActivity.this); 
      int height = 200; 
      int width = 300; 
      btn.setLayoutParams(new LinearLayout.LayoutParams(width, height)); 
      btn.setTag(10); 
      ConstraintLayout layout = (ConstraintLayout) findViewById(R.id.deneme); 
      layout.addView(btn); 
      mHandler.postDelayed(this, 10); 
     } 
    }); 
関連する問題