0

これは私の主な活動です:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }
}

そして、これはスレッドを実行するクラスです

public class Ads implements Runnable {

    private Activity activity;

    public Ads(Activity activity) {
        // TODO Auto-generated constructor stub
        this.activity = activity;
        new Thread(this).start();
    }

    @Override
    public void run() {
        FrameLayout layout = new FrameLayout(activity);
        layout.setBackgroundColor(Color.BLACK);
        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(300, 75, Gravity.CENTER);
        TextView txt = new TextView(activity);
        txt.setText("ASD");
        layout.addView(txt);
        activity.getWindow().addContentView(layout, params);
    }

}

このコードを実行しましたが、アプリケーションを開始できませんでした。現在のアクティビティにレイアウトを追加するには? 助けてください、tks

4

2 に答える 2

2

ワーカー スレッドから UI を初期化することはできません。これはメインスレッドで行う必要があります。スレッドは、複雑な計算を行うためだけに使用されます。すべてがここにあります: http://developer.android.com/guide/components/processes-and-threads.html

initUI 関数を追加できます

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    initUI();
}


private void initUI() {
    FrameLayout layout = new FrameLayout(this);
    layout.setBackgroundColor(Color.BLACK);
    FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(300, 75, Gravity.CENTER);
    TextView txt = new TextView(this);
    txt.setText("ASD");
    layout.addView(txt);
    getWindow().addContentView(layout, params);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
于 2013-06-09T16:12:05.600 に答える
2

Class がスレッドで実行される場合、それはメインAdsrun()UI スレッド (実行されるスレッド) ではないためonCreate()、内部run()で UI ビューを変更することはできません。

したがって、以下を使用して UI を変更するコードを実行しますrunOnUIThread()

runOnUIThread(new Runnable{
 @Override
 public void run(){
   //make changes to UI here--
 }
});

ちなみに、そのコードを配置できるonCreate()のは、あまり機能していません。

また、このトレーニング記事では、UI スレッドとの通信について詳しく説明しています。

于 2013-06-09T16:16:09.527 に答える