2

可変数のビューを RelativeLayout に追加するためのループがあり、のようないくつかのルールを設定したいのですがBELOW、私の問題は、タグを使用してオブジェクトに動的に名前を付けておりaddRule()、id を使用する必要があるメソッドを使用していることです。 、私が試したのは、ループが実行されるたびに Id を設定することであり、それは初めてではありません。

これは私のコードです:

for(int i = 1; i <= kNumberofViews; i++){
    View = new MyView(context);
    RelativeLayout.LayoutParams params = new LayoutParams(kViewWidth, kViewHeight);
    params.setMargins(kMarginLeft, kMarginTop, kMarginRight, kMarginBottom);
    params.addRule(CENTER_HORIZONTAL);
    if (i != 1){
        MyView view = (MyView)view.findViewWithTag(i-1);
        view.setId(i);
        params.addRule(RelativeLayout.BELOW, view.getId());
    }
    View.setTag(i);
    View.setBackgroundColor(Color.GREEN);
    System.out.println("View " + i +" added correctly");
    addView(View, params);
}

どうすれば解決できますか?

編集:

05-18 14:57:19.549: E/AndroidRuntime(5500): FATAL EXCEPTION: main
05-18 14:57:19.549: E/AndroidRuntime(5500): java.lang.RuntimeException: Unable to start activity ComponentInfo{me.gabrielesteban.app/me.gabrielesteban.app.MyRelativeLayoutTest}: android.view.InflateException: Binary XML file line #7: Error inflating class me.gabrielesteban.app.GD.MyRelativeLayout
05-18 14:57:19.549: E/AndroidRuntime(5500):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2307)
05-18 14:57:19.549: E/AndroidRuntime(5500):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2357)
05-18 14:57:19.549: E/AndroidRuntime(5500):     at android.app.ActivityThread.access$600(ActivityThread.java:153)

編集2:

問題は次の行にあると思いますが、MyView view = (MyView)view.findViewWithTag(i-1);この行は正しいですか?

4

2 に答える 2

1

新しい ID を割り当てる前に、ID が割り当てられているかどうかを確認してください。

for(int i = 1; i <= kNumberofViews; i++){
    View v = new MyView(context);
    RelativeLayout.LayoutParams params = new LayoutParams(kViewWidth, kViewHeight);
    params.setMargins(kMarginLeft, kMarginTop, kMarginRight, kMarginBottom);
    params.addRule(CENTER_HORIZONTAL);
    if (i != 1){
        MyView view = (MyView)findViewWithTag(i-1);
        if (view.getId() == View.NO_ID)
            view.setId(i);
        params.addRule(RelativeLayout.BELOW, view.getId());
    }
    View.setTag(i);
    View.setBackgroundColor(Color.GREEN);
    System.out.println("View " + i +" added correctly");
    addView(View, params);
}

編集

編集し、ドキュメントを確認しました。そのとおりです。ビューをnullにすることはできませんが、ビューが割り当てられていない場合、返される値はView.NO_ID(または-1)です。

于 2013-05-18T12:41:19.583 に答える
1

私は自分のコードをもう一度見直し、アクティビティの OnCreate() メソッドで findViewWithTag を呼び出すにはどうすればよいですか?も読みました。そして、findViewWithTag()メソッドを呼び出すと、メソッドの前に見つけたのと同じオブジェクトを置くことがわかります。そのため、そのタグを持つオブジェクト内のオブジェクトが見つからないという結果になりました。その部分を削除することでした。

MyView view = (MyView)view.findViewWithTag(i-1); //Bad way to find the View

MyView view = (MyView)findViewWithTag(i-1); //Good way to find the View by tag
于 2013-05-18T13:33:43.737 に答える