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

编辑

编辑,检查文档,你是对的,视图不能为空,但如果没有分配视图,则返回值为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 回答