2012-03-18 3 views
2

findViewById에서 많은 스레드를 읽었으므로 사용자 정의 클래스에 대해 null을 반환하고 정확하게 오류를 찾을 수 없습니다. 조각 (LinearLayout)을 부 풀리는 주요 활동이 있습니다. 이 LinearLayout에 핸들러를 사용하여 여러 개의 사용자 정의 ImageView를 채우고 싶습니다. 핸들러는 기본적으로 각 사용자 정의 ImageView를 만들고이를 ArrayList에 저장합니다.이 ArrayList는 주 활동에서 읽을 수 있습니다. 내 사용자 지정 이미지 뷰에서findViewById는 핸들러 클래스를 사용하여 사용자 정의 ImageView에 대해 null을 반환합니다.

나는 다음과 같은 생성자를 가지고 : 나는 경우 테스트하기 위해 다음을 수행 내 주요 활동에서

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

:

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

그럼 내 핸들러 클래스에 나는 다음을 수행 첫 번째 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을 생성하기 때문입니다. 그들이 주 활동에서 null인지 아닌지를 확인하는 대신, (ViewViewById를 사용하여) 사용 가능한 ViewGroup에 추가하고 싶습니다. 내 Fragment의 ViewGroup을 채울 때 정의에 따라 사용자 정의 ImageViews가 고아라고 말하지만, 내가 필요로하는 위치에서 고아가 null이므로이 작업을 수행 할 수 없습니다. –

관련 문제