findViewById使用处理程序类为自定义ImageView返回null
问题描述:
我已经通过findViewById上的很多线程读取了自定义类的返回null,并且我无法准确找到我的错误。我有一个主要的活动,膨胀一个片段(LinearLayout)。我想用我的几个自定义ImageView使用处理程序填充此LinearLayout。该处理程序基本上创建每个自定义ImageView并将它们放入一个ArrayList中,这个ArrayList可以在主要活动中读取。findViewById使用处理程序类为自定义ImageView返回null
在我的自定义的ImageView我有以下构造函数:
public CustomView(Context context) {
super(context);
}
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomView(Context context, int ID, String c, String s, int relID, int relAngle,
Float absX, Float absY, int [] inNumbers) {
super(context);
this.setId(ID);
color = c;
size = s;
x_pos = absX;
y_pos = absY;
dependence = inNumbers;
rel_id = relID;
rel_angle = relAngle;
}
然后,在我的处理程序类我做到以下几点:
customViews = new ArrayList<CustomView>();
for (int k = 0; k < numberOfCustomViews; k++){
CustomView w = new CustomView(ctx,
scanner.nextInt(), //ID
scanner.next(), //Color
scanner.next(), //Size
scanner.nextInt(), //Relative ID
scanner.nextInt(), //Relative angle
scanner.nextFloat(), //Absolute x (percent)
scanner.nextFloat(), //Absolute y (percent)
new int[] {scanner.nextInt(), //Dependence numbers
scanner.nextInt()});
customViews.add(w);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
w.getSizeAsResource(), w.getSizeAsResource());
w.setLayoutParams(lp);
Log.d(TAG, "CustomView added!");
}
在我的主要活动我做以下测试,如果第一个CustomView可用:
customViewTest = (CustomView) (findViewById(customViewHandler.customViews.get(1).getId()));
if (customViewTest == null)
Toast.makeText(this, "customViewTest == null", Toast.LENGTH_LONG).show();
这总是显示敬酒。我在这里错过了什么?我需要一些充气或什么?应该可以以编程方式将自定义视图添加到布局。
答
确实有可能以编程方式将视图添加到布局,但似乎实际上并未将视图添加到任何布局。您只是创建一个视图列表。
Activity.findViewById
会返回你一个视图,如果有一些视图与其布局中包含的特定ID。这意味着即使它们具有正确的ID,也不会找到不属于主视图层次结构的视图。
执行完'处理程序类'后,最终会生成一个孤儿视图的列表,也就是说,它们没有父视图,特别是它们不属于活动布局的一部分。
鉴于您希望将它们分段使用,将它们直接添加到活动的主布局是没有意义的。片段的好处之一是您可以管理较小的相关视图组。您应该将自定义视图添加到要使用的片段的视图中。您可以将所需参数传递给片段并让它构造这些视图。
我没有在自己的代码中添加自定义ImageViews的原因是它产生了nullPointerExceptions。而不是仅仅检查它们是否在主要活动中,我想将它们添加到可用的ViewGroup中(使用findViewById)。 正如你所说的定制ImageViews ar每个定义孤儿,当我尝试填充我的片段的ViewGroup,但我不能这样做,因为我的孤儿在我需要他们的地方是空的。 – 2012-03-19 13:07:57