2012-10-13 5 views
1

예외 사용 : 이것은 내 XML이android.view.InflateException : 바이너리 XML 파일 라인 사용자 정의보기

>   10-13 11:47:32.151: E/AndroidRuntime(618): FATAL EXCEPTION: main 
> 
>  10-13 11:47:32.151: E/AndroidRuntime(618): android.view.InflateException: Binary XML file line #3: Error 
> inflating class com.example.demo.ToDoListView 10-13 11:47:32.151: 
> E/AndroidRuntime(618): at 
> android.view.LayoutInflater.createView(LayoutInflater.java:596) 10-13 
> 11:47:32.151: E/AndroidRuntime(618): at 
> android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687) 
> 10-13 11:47:32.151: E/AndroidRuntime(618): at 
> android.view.LayoutInflater.inflate(LayoutInflater.java:466) 10-13 
> 11:47:32.151: E/AndroidRuntime(618): at 
> android.view.LayoutInflater.inflate(LayoutInflater.java:396) 10-13 
> 11:47:32.151: E/AndroidRuntime(618): at 
> android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:371) 
> 10-13 11:47:32.151: E/AndroidRuntime(618): at 
> android.widget.ArrayAdapter.getView(ArrayAdapter.java:362) 10-13 
> 11:47:32.151: E/AndroidRuntime(618): at 
> android.widget.AbsListView.obtainView(AbsListView.java:2267) 10-13 
> 11:47:32.151: E/AndroidRuntime(618): at 
> android.widget.ListView.measureHeightOfChildren(ListView.java:1244) 
> 10-13 11:47:32.151: E/AndroidRuntime(618): at 
> android.widget.ListView.onMeasure(ListView.java:1156) 10-13 
> 11:47:32.151: E/AndroidRuntime(618): at 
> android.view.View.measure(View.java:15172) 10-13 11:47:32.151: 
> E/AndroidRuntime(618): at 
> android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814) 
> 10-13 11:47:32.151: E/AndroidRuntime(618): at 
> android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 10-13 
> 11:47:32.151: E/AndroidRuntime(618): at 
> android.view.View.measure(View.java:15172) 10-13 11:47:32.151: 
> E/AndroidRuntime(618): at 
> android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814) 
> 10-13 11:47:32.151: E/AndroidRuntime(618): at 
> android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 10-13 
> 11:47:32.151: E/AndroidRuntime(618): at 
> android.view.View.measure(View.java:15172) 10-13 11:47:32.151: 
> E/AndroidRuntime(618): at 
> android.widget.RelativeLayout.measureChild(RelativeLayout.java:602) 
> 10-13 11:47:32.151: E/AndroidRuntime(618): at 
> android.widget.RelativeLayout.onMeasure(RelativeLayout.java:415) 10-13 
> 11:47:32.151: E/AndroidRuntime(618): at 
> android.view.View.measure(View.java:15172) 10-13 11:47:32.151: 
> E/AndroidRuntime(618): at 
> android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814) 
> 10-13 11:47:32.151: E/AndroidRuntime(618): at 
> android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 10-13 
> 11:47:32.151: E/AndroidRuntime(618): at 
> android.view.View.measure(View.java:15172) 10-13 11:47:32.151: 
> E/AndroidRuntime(618): at 
> android.widget.LinearLayout.measureVertical(LinearLayout.java:833) 

입니다. 오류가 표시되지 않습니다.

<?xml version="1.0" encoding="utf-8"?> 

<com.example.demo.ToDoListView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:padding="10dp" 
    android:scrollbars="vertical" 
    android:textColor="@color/notepad_text" 
    android:fadingEdge="vertical" 
/> 

나는 목록 어댑터와 함께 사용하는 것을 시도하고있다 :

 aa=new ArrayAdapter<String>(this, R.layout.todolist_item,todoItems); 

목록 클래스를 수행하려면

public class ToDoListView extends TextView{ 
    private Paint marginPaint; 
    private Paint linePaint; 
    private int paperColor; 
    private float margin; 

    public ToDoListView(Context context) { 
     super(context); 
     // TODO Auto-generated constructor stub 
    } 

    public ToDoListView(Context context, AttributeSet st, int ds) { 
     super(context); 
     init(); 
    } 

    private void init() { 
     Resources myResources=getResources(); 
     marginPaint=new Paint(Paint.ANTI_ALIAS_FLAG); 
     marginPaint.setColor(myResources.getColor(R.color.notepad_margin)); 
     linePaint=new Paint(Paint.ANTI_ALIAS_FLAG); 
     linePaint.setColor(myResources.getColor(R.color.notepad_lines)); 
     paperColor=myResources.getColor(R.color.notepad_paper); 
     margin=myResources.getDimension(R.dimen.notepad_margin);  
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     canvas.drawColor(paperColor); 
     canvas.drawLine(0, 0, 0, getMeasuredHeight(), linePaint); 
     canvas.drawLine(0, getMeasuredHeight(), getMeasuredWidth(), getMeasuredHeight(), linePaint); 
     canvas.drawLine(margin, 0, margin, getMeasuredHeight(), marginPaint); 
     canvas.save(); 
     canvas.translate(margin, 0); 
     super.onDraw(canvas); 
     canvas.restore(); 
    } 



} 
+1

"com.example.demo.ToDoListView"는 사용자 정의 클래스에있는 것과 정확히 일치하지 않는다고 생각합니다. AndroidManifest에서 패키지 이름을 가져오고 Java 파일에서 클래스 이름을 가져옵니다. –

+0

그 아래에 팽창 예외가 발생해야하는 이유는 무엇입니까? – Luksprog

+0

Chintant .. 도움이 안되었습니다 .. 업데이트보기 –

답변

12

당신은 당신이 필요로하는 XML 레이아웃에서 사용자 정의보기를 사용하는 경우 이 생성자를 수정하려면

public ToDoListView(Context context, AttributeSet st, int ds) { 
    super(context); 
    init(); 
} 

에서 :

public ToDoListView(Context context, AttributeSet st) { 
    super(context, st); 
    init(); 
} 
+0

예, 생성자에서 실수가있는 곳 .. –

+0

@DmitryMakovetskiyd 그렇지 않으면 'LayoutInflater'는보기를 인스턴스화하는 데 필요한 생성자를 찾지 못합니다. – Luksprog

+0

젠장, 아직도 그 실수를 던졌습니다. –

1

모든 시나리오를 다루는 사용자 지정보기에는 멋진 패턴이 있습니다. Luksprog는 물론 정확하지만 가능한 생성자는 하나만 다룹니다. 기본보기의 경우 :

public MyCustomView(Context context){ 
    this(context, null); 
} 

public MyCustomView(Context context, AttributeSet attrs){ 
    this(context, attrs, 0); 
} 

public MyCustomView(Context context, AttributeSet attrs, int defaultStyle){ 
    super(context, attrs, defaultStyle); 
    init(); 
} 

이 패턴을 사용하면 어떤 과부하가 사용 되더라도 super 및 init이 항상 올바르게 호출됩니다. onDraw가 미리 컴파일 할 수없는 외부 종속성없이 그릴 수 있다고 가정하면 사용자 정의보기도 UI 미리보기에서 올바르게 렌더링됩니다.

관련 문제