2012-03-18 72 views
2

我已经通过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(); 

这总是显示敬酒。我在这里错过了什么?我需要一些充气或什么?应该可以以编程方式将自定义视图添加到布局。

回答

2

确实有可能以编程方式将视图添加到布局,但似乎实际上并未将视图添加到任何布局。您只是创建一个视图列表。

Activity.findViewById会返回你一个视图,如果有一些视图与其布局中包含的特定ID。这意味着即使它们具有正确的ID,也不会找到不属于主视图层次结构的视图。

执行完'处理程序类'后,最终会生成一个孤儿视图的列表,也就是说,它们没有父视图,特别是它们不属于活动布局的一部分。

鉴于您希望将它们分段使用,将它们直接添加到活动的主布局是没有意义的。片段的好处之一是您可以管理较小的相关视图组。您应该将自定义视图添加到要使用的片段的视图中。您可以将所需参数传递给片段并让它构造这些视图。

+0

我没有在自己的代码中添加自定义ImageViews的原因是它产生了nullPointerExceptions。而不是仅仅检查它们是否在主要活动中,我想将它们添加到可用的ViewGroup中(使用findViewById)。 正如你所说的定制ImageViews ar每个定义孤儿,当我尝试填充我的片段的ViewGroup,但我不能这样做,因为我的孤儿在我需要他们的地方是空的。 – 2012-03-19 13:07:57

相关问题