2013-02-19 3 views
0

보기에서 확장 된 사용자 지정보기 클래스가 있고이를 활동에 사용하고 싶지만 아무 것도 표시하지 않습니다. 실행되는 오류는 없지만 검정색 화면에는 출력이 없습니다. 내 코드는 다음과 같다 :사용자 지정보기가 나타나지 않습니다.

public class MoveableMenuLayout extends View { 


    public MoveableMenuLayout(Context context, AttributeSet attrs) { 

     super(context, attrs); 
     LinearLayout ll = new LinearLayout(context); 
     ll.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
     TextView tv = new TextView(context); 
     tv.setText("TES_______________"); 
     ll.addView(tv); 

     this.invalidate(); 
     this.requestLayout(); 
    } 

    public MoveableMenuLayout(Context context) { 
     super(context); 

     LinearLayout ll = new LinearLayout(context); 
     ll.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
     TextView tv = new TextView(context); 
     tv.setText("TES_______________"); 
     ll.addView(tv); 

     this.invalidate(); 
     this.requestLayout(); 

    } 
} 

호출 활동

public class TestActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     MoveableMenuLayout layout = new MoveableMenuLayout(this); 
     setContentView(layout); 
    } 
} 

내가 XML 레이아웃하지만 여전히 출력에 추가하여 시도했다. 내가 뭘 잘못하고 있는지 모르겠다. 나는 그것을 별도의 클래스가되기를 원하는 스타일을 변경하고 싶지 않다. xml 레이아웃을 사용할 수 있고 setcontentview를 사용하여 Activity에서 직접 설정할 수 있지만 그렇게하고 싶지는 않다. 감사합니다.

+0

먼저 생성 된 선형 레이아웃이 뷰에 추가되지 않습니다. 또한 컨테이너가 아니기 때문에 다른보기를 간단한보기에 추가 할 수 없습니다. MoveableMenuLayout을 확장하는 ViewGroup 중 하나를 시도해 볼 수 있습니다. – Triode

답변

1

왜 데이터가 없습니다. 선형 레이아웃과 텍스트보기를 만들었지 만 자녀는 아닙니다. 그러므로 그리기 데이터가 없습니다 (어쨌든 onDraw를 재정의하지 않았습니다).

다른보기 집합을 보유하는 사용자 지정보기를 만들려면보기가 아닌보기 그룹에서 파생되어야합니다. 또한 최상위 하위 뷰를 자식으로 추가해야합니다. 하위 뷰는 데이터 멤버로 보유하지 않아야합니다. LienarLayout 또는 RelativeLayout에서 직접 파생하는 것이 더 낫고 xml에서 직접 자녀를 부 풀릴 수 있습니다.

public class MoveableMenuLayout extends ViewGroup { 


public MoveableMenuLayout(Context context, AttributeSet attrs) { 

    super(context, attrs); 
    LinearLayout ll = new LinearLayout(context); 
    ll.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
    TextView tv = new TextView(context); 
    tv.setText("TES_______________"); 
    ll.addView(tv); 
    addView(ll); 
} 

public MoveableMenuLayout(Context context) { 
    super(context); 

    LinearLayout ll = new LinearLayout(context); 
    ll.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
    TextView tv = new TextView(context); 
    tv.setText("TES_______________"); 
    ll.addView(tv); 
    addView(ll); 

} 

}

아마 작동합니다. 대신 LinearLayout에서 파생시켜이를 확실히 업그레이드 할 수 있습니다. 그러면 내부 레이아웃이 필요하지 않습니다. 이처럼 :

public class MoveableMenuLayout extends LinearLayout { 


public MoveableMenuLayout(Context context, AttributeSet attrs) { 

    super(context, attrs); 
    TextView tv = new TextView(context); 
    tv.setText("TES_______________"); 
    addView(tv); 
} 

public MoveableMenuLayout(Context context) { 
    super(context); 

    TextView tv = new TextView(context); 
    tv.setText("TES_______________"); 
    addView(tv); 

} 

}

더 좋은 방법은 XML

public class MoveableMenuLayout extends LinearLayout { 


public MoveableMenuLayout(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    LayoutInflater inflater = (LayoutInflater)context.getSystemService(
      Context.LAYOUT_INFLATER_SERVICE); 
    inflater.inflate(ourlayoutid, this); 
} 

public MoveableMenuLayout(Context context) { 
    super(context); 

    LayoutInflater inflater = (LayoutInflater)context.getSystemService(
      Context.LAYOUT_INFLATER_SERVICE); 
    inflater.inflate(ourlayoutid, this); 

} 

}

을 통해 그것을 다음 XML 파일에서 원하는 아이들을 넣어하는 것입니다. 이 경우 xml 파일의 최상위 태그는 레이아웃이 아닌 태그 여야합니다.

+0

viewgroup을 사용하여 예제를 제공 할 수 있습니까? – user606669

+0

위대한 작품입니다. 감사 – user606669

0

부모 선형 레이아웃의 레이아웃 매개 변수 만 선언하고 자식 텍스트 뷰는 사용하지 않기 때문에 textview의 레이아웃 매개 변수를 사용해보십시오. 높이와 너비를 얻지 못할 것입니다.

관련 문제