2011-05-22 60 views
0

我已经坚持了大约12小时,现在对一些恼人的运行时异常,当我尝试膨胀我创建的自定义视图时,一直在发生。这是我的第一个Android(和Java)程序,所以希望我没有做一些愚蠢的事情。从XML膨胀自定义视图创建Illegalstateexception(Android,Java)

XML:

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

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:padding="10px" > 

<com.studentfees.GraphView/> 

</RelativeLayout> 

类别:

public class GraphView extends View { 

    Paint paint    = new Paint(); 
    Boolean IsTouched  = false; 
    float TouchCoords[]  = new float[2]; 
    public enum GraphType {Earnings, Payments, TotalPaid, NoneSet}; 
    GraphType graphtype = GraphType.NoneSet; 
    Graph graph = new Graph(); 
    Button ButtonLeft; 
    Button ButtonCentre; 
    Button ButtonRight; 

    public GraphView(Context context, AttributeSet attrs) 
    { 
      super(context, attrs); 

     graphtype = GraphType.Earnings; 
     paint.setColor(Color.BLACK); 
     paint.setAntiAlias(true); 
     paint.setStrokeWidth(5); 

    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) 
    { 
     IsTouched = true; 
     TouchCoords[0] = event.getX(); 
     TouchCoords[1] = event.getY(); 
     this.invalidate(); 
     return super.onTouchEvent(event); 

    } 

    @Override 
    public void onDraw(Canvas canvas) { 

     GraphSetUp(canvas); 

     TouchHandler(canvas); 

     ButtonSetUp(); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    } 

    private void ButtonSetUp() 
    { 

    } 

    private void TouchHandler(Canvas canvas) 
    { 
     if(IsTouched) 
     { 
      IsTouched = false; 
      canvas.drawCircle(TouchCoords[0], TouchCoords[1],10, paint); 
     } 
    } 

    private void GraphSetUp(Canvas canvas) 
    { 
     graph.DrawAxis(canvas, this); 

     switch(graphtype) 
     { 
     case Earnings: graph.LineCoords =  Coordinate.ToCoordArray(studentfeesproject.student.ListofEarnings); break; 
     case Payments: graph.LineCoords = Coordinate.ToCoordArray(studentfeesproject.student.ListofPayments); break; 
     case TotalPaid: graph.LineCoords = graph.ToHistogram(Coordinate.ToCoordArray(studentfeesproject.student.ListofPayments)); break; 
     default: break; 
     } 

     graph.LineCoords = graph.CoordsToGraph(graph.LineCoords); 
     graph.DrawLineOnGraph(canvas); 

    }  


} 

日志:

05-22 13:57:04.028: ERROR/AndroidRuntime(10594): FATAL EXCEPTION: main 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594): java.lang.IllegalStateException: Could not execute method of the activity 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594):  at android.view.View$1.onClick(View.java:2082) 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594):  at android.view.View.performClick(View.java:2461) 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594):  at android.view.View$PerformClick.run(View.java:8888) 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594):  at android.os.Handler.handleCallback(Handler.java:587) 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594):  at android.os.Handler.dispatchMessage(Handler.java:92) 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594):  at android.os.Looper.loop(Looper.java:123) 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594):  at java.lang.reflect.Method.invoke(Method.java:521) 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594):  at dalvik.system.NativeStart.main(Native Method) 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594): Caused by: java.lang.reflect.InvocationTargetException 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594):  at com.studentfees.studentfeesproject.GetResults(studentfeesproject.java:51) 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594):  at java.lang.reflect.Method.invoke(Method.java:521) 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594):  at android.view.View$1.onClick(View.java:2077) 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594):  ... 11 more 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594): Caused by: java.lang.RuntimeException: Binary XML file line #10: You must supply a layout_width attribute. 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594):  at android.content.res.TypedArray.getLayoutDimension(TypedArray.java:491) 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594):  at android.view.ViewGroup$LayoutParams.setBaseAttributes(ViewGroup.java:3592) 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594):  at android.view.ViewGroup$MarginLayoutParams.<init>(ViewGroup.java:3672) 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594):  at android.widget.RelativeLayout$LayoutParams.<init>(RelativeLayout.java:1047) 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594):  at android.widget.RelativeLayout.generateLayoutParams(RelativeLayout.java:917) 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594):  at android.widget.RelativeLayout.generateLayoutParams(RelativeLayout.java:66) 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:620) 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:621) 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594):  at android.view.LayoutInflater.inflate(LayoutInflater.java:382) 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594):  at android.view.LayoutInflater.inflate(LayoutInflater.java:320) 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594):  at android.view.LayoutInflater.inflate(LayoutInflater.java:276) 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:200) 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594):  at android.app.Activity.setContentView(Activity.java:1647) 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594):  ... 15 more 

+++++++++++ +++++++ ++++ +++++++++++

编辑:

新的日志作为第一个答案的结果 - 感谢您的帮助inazaruk:

05-22 16:02:23.055: WARN/dalvikvm(13186): threadid=1: thread exiting with uncaught exception (group=0x4001d7d0) 
05-22 16:02:23.071: ERROR/AndroidRuntime(13186): FATAL EXCEPTION: main 
05-22 16:02:23.071: ERROR/AndroidRuntime(13186): java.lang.NullPointerException 
05-22 16:02:23.071: ERROR/AndroidRuntime(13186):  at com.studentfees.Graph.CoordsToGraph(Graph.java:81) 
05-22 16:02:23.071: ERROR/AndroidRuntime(13186):  at com.studentfees.GraphView.GraphSetUp(GraphView.java:93) 
05-22 16:02:23.071: ERROR/AndroidRuntime(13186):  at com.studentfees.GraphView.onDraw(GraphView.java:55) 
05-22 16:02:23.071: ERROR/AndroidRuntime(13186):  at android.view.View.draw(View.java:6793) 
05-22 16:02:23.071: ERROR/AndroidRuntime(13186):  at android.view.ViewGroup.drawChild(ViewGroup.java:1640) 
05-22 16:02:23.071: ERROR/AndroidRuntime(13186):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 
05-22 16:02:23.071: ERROR/AndroidRuntime(13186):  at android.view.ViewGroup.drawChild(ViewGroup.java:1638) 
05-22 16:02:23.071: ERROR/AndroidRuntime(13186):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 
05-22 16:02:23.071: ERROR/AndroidRuntime(13186):  at android.view.View.draw(View.java:6796) 
05-22 16:02:23.071: ERROR/AndroidRuntime(13186):  at android.widget.FrameLayout.draw(FrameLayout.java:354) 
05-22 16:02:23.071: ERROR/AndroidRuntime(13186):  at android.view.ViewGroup.drawChild(ViewGroup.java:1640) 
05-22 16:02:23.071: ERROR/AndroidRuntime(13186):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 
05-22 16:02:23.071: ERROR/AndroidRuntime(13186):  at android.view.ViewGroup.drawChild(ViewGroup.java:1638) 
05-22 16:02:23.071: ERROR/AndroidRuntime(13186):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 
05-22 16:02:23.071: ERROR/AndroidRuntime(13186):  at android.view.View.draw(View.java:6796) 
05-22 16:02:23.071: ERROR/AndroidRuntime(13186):  at android.widget.FrameLayout.draw(FrameLayout.java:354) 
05-22 16:02:23.071: ERROR/AndroidRuntime(13186):  at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1894) 
05-22 16:02:23.071: ERROR/AndroidRuntime(13186):  at android.view.ViewRoot.draw(ViewRoot.java:1432) 
05-22 16:02:23.071: ERROR/AndroidRuntime(13186):  at android.view.ViewRoot.performTraversals(ViewRoot.java:1174) 
05-22 16:02:23.071: ERROR/AndroidRuntime(13186):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1752) 
05-22 16:02:23.071: ERROR/AndroidRuntime(13186):  at android.os.Handler.dispatchMessage(Handler.java:99) 
05-22 16:02:23.071: ERROR/AndroidRuntime(13186):  at android.os.Looper.loop(Looper.java:123) 
05-22 16:02:23.071: ERROR/AndroidRuntime(13186):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
05-22 16:02:23.071: ERROR/AndroidRuntime(13186):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-22 16:02:23.071: ERROR/AndroidRuntime(13186):  at java.lang.reflect.Method.invoke(Method.java:521) 
05-22 16:02:23.071: ERROR/AndroidRuntime(13186):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
05-22 16:02:23.071: ERROR/AndroidRuntime(13186):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
05-22 16:02:23.071: ERROR/AndroidRuntime(13186):  at dalvik.system.NativeStart.main(Native Method) 

回答

0

从日志:

05-22 13:57:04.028: ERROR/AndroidRuntime(10594): Caused by: java.lang.RuntimeException: Binary XML file line #10: You must supply a layout_width attribute. 
05-22 13:57:04.028: ERROR/AndroidRuntime(10594):  at android.content.res.TypedArray.getLayoutDimension(TypedArray.java:491) 

您必须指定layout_widthlayout_height

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:padding="10px" > 

    <com.studentfees.GraphView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" /> 

</RelativeLayout> 

通常您必须指定layout_widthlayout_height所有项目内部布局。在某些情况下,这是可选的,但它们有很好的文档记录。


现在您的应用程序因其他原因失败:NullPointerException。它发生在你的GraphSetUp功能在这里:

switch(graphtype) 
{ 
    case Earnings: graph.LineCoords =  Coordinate.ToCoordArray(studentfeesproject.student.ListofEarnings); break; 
    case Payments: graph.LineCoords = Coordinate.ToCoordArray(studentfeesproject.student.ListofPayments); break; 
+0

添加了布局参数,但仍然得到了同样的问题:( – aforward 2011-05-22 14:21:51

+0

你得到完全相同的日志可能新日志添加到您的问题 – inazaruk 2011-05-22 14:40:28

+0

我已经添加了新的?登录为编辑,谢谢 – aforward 2011-05-22 15:06:27