2013-10-31 4 views
1

이미지와 텍스트를 추가 할 수있는 customview를 만들려고합니다. 내가이 일을하는 이유는 내가 만들고있는 중이기 때문에이 코드를 반복하기 위해 동일한 코드를 반복하고 있기 때문에 나는 그것을 자신의 커스텀 뷰로 감싸고 싶다. 그래서 나는 setter와 position을 사용할 수있다. 뷰를 서로에 상대적으로 배치하여이 코드를 모두 하나의 클래스에 간단하게 배치합니다.CustomView extends RelativeLayout

텍스트 뷰와 이미지 뷰를 뷰에 추가 할 수 있지만, 뷰와 이미지 뷰를 서로 관련되게 배치하려고 할 때 항상 NPE 충돌이 발생합니다.

여기는 지금까지 가지고있는 코드입니다. TextView를 추가 한 다음 TextView를 내 사용자 정의보기 중앙에 배치하기 만하면됩니다.

public class MultiView extends RelativeLayout { 
    Context cx; 
    int images = 0; 

    public MultiView(Context context) { 

     super(context); 
     cx = context; 
    } 

    public void addText(String textParam) { 

     TextView tv = new TextView(cx); 

     tv.setText(textParam); 

     tv.setTextColor(Color.WHITE); 

     RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) tv 
       .getLayoutParams(); 

     layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT); 

//  tv.setLayoutParams(layoutParams); // the app crashes when I add this line 

     this.addView(tv); 
    } 

} 

답변

2

전체 클래스 :

당신이 그 라인에 충돌을 얻을 매우 이상하다
public class MultiView extends RelativeLayout { 
    Context cx; 
    int images = 0; 

    public MultiView(Context context) { 

     super(context); 
     cx = context; 
    } 

    public void addText(String textParam) { 

     RelativeLayout.LayoutParams layoutParams = 
     new RelativeLayout.LayoutParams(
      RelativeLayout.LayoutParams.WRAP_CONTENT,  
      RelativeLayout.LayoutParams.WRAP_CONTENT); 


     TextView tv = new TextView(cx); 
     tv.setText(textParam); 
     tv.setTextColor(Color.WHITE); 
     layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT); 
     tv.setLayoutParams(layoutParams); 
     this.addView(tv); 
    } 

} 
+0

답 주셔서 대단히 감사합니다! 당신이 나에게 읽기 쉬운 전체 수업을 주었기 때문에 이것을 답으로 표시 할 것입니다! – brux

+0

이 답변은 오래된 답변입니다. 그러나이'MultiView'가'LinearLayout' 내부에 부모로 추가되면'RelativeLayout.CENTER_IN_PARENT'에 대한 규칙이 무엇인지 알고 계십니까? 보기 계층 구조가 LL> MultiView가됩니다. – nightfixed

+0

@nightfixed 무슨 뜻인지 이해가 안됩니다. – ramaral

1

: 내가보기 돈 생성하기 때문에 그 줄에 그것을 얻을 당신을 생각

tv.setLayoutParams(layoutParams); 

LayoutParams가 없다 (RelativeLayout.LayoutParams 인 경우) :

layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT); 
(210)

나는 당신의 DevBytes에서이 비디오에 의해 addText() 메소드를 향상시킬 수 있다고 생각 : http://www.youtube.com/watch?v=55wLsaWpQ4g

그러나 당신이 당신의 코드가 작동을 할 경우는 다음과 같이 당신의 단계를 대체해야합니다

TextView tv = new TextView(cx); 
tv.setText(textParam); 
tv.setTextColor(Color.WHITE); 
this.addView(tv); // Programatically created View get LayoutParams when we add it to a ViewGroup 

RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) tv.getLayoutParams(); 
layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT); 
tv.setLayoutParams(layoutParams); 

또는 자기하여 레이아웃 PARAMS을 만듭니다

TextView tv = new TextView(cx); 
tv.setText(textParam); 
tv.setTextColor(Color.WHITE); 

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT); 
tv.setLayoutParams(layoutParams); 

this.addView(tv); 
1

을 난 당신이 NPEtv.getLayoutParams(); 때문에 반환 null를 얻을 생각합니다.

는 다음과 같은 시도 :이 훌륭하게 일

RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT); 

tv.setLayoutParams(layoutParams); // the app crashes when I add this line 

this.addView(tv);