androidexercise1compass

书上的一个例子,一步一步按照树上的做但是还是出现了一点小错误:在catlog中:error openging trace file:No such file or directory(2) 指的是我自定义的view类,并且有inflate错误

03-12 02:09:57.254: D/AndroidRuntime(789): Shutting down VM
03-12 02:09:57.254: W/dalvikvm(789): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
03-12 02:09:57.304: E/AndroidRuntime(789): FATAL EXCEPTION: main
03-12 02:09:57.304: E/AndroidRuntime(789): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.compassapp/com.example.compassapp.MainActivity}: android.view.InflateException: Binary XML file line #12: Error inflating class com.example.compassapp.CompassView
03-12 02:09:57.304: E/AndroidRuntime(789):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
03-12 02:09:57.304: E/AndroidRuntime(789):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
03-12 02:09:57.304: E/AndroidRuntime(789):  at android.app.ActivityThread.access$600(ActivityThread.java:141)
03-12 02:09:57.304: E/AndroidRuntime(789):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
03-12 02:09:57.304: E/AndroidRuntime(789):  at android.os.Handler.dispatchMessage(Handler.java:99)
03-12 02:09:57.304: E/AndroidRuntime(789):  at android.os.Looper.loop(Looper.java:137)
03-12 02:09:57.304: E/AndroidRuntime(789):  at android.app.ActivityThread.main(ActivityThread.java:5041)
03-12 02:09:57.304: E/AndroidRuntime(789):  at java.lang.reflect.Method.invokeNative(Native Method)
03-12 02:09:57.304: E/AndroidRuntime(789):  at java.lang.reflect.Method.invoke(Method.java:511)
03-12 02:09:57.304: E/AndroidRuntime(789):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
03-12 02:09:57.304: E/AndroidRuntime(789):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
03-12 02:09:57.304: E/AndroidRuntime(789):  at dalvik.system.NativeStart.main(Native Method)
03-12 02:09:57.304: E/AndroidRuntime(789): Caused by: android.view.InflateException: Binary XML file line #12: Error inflating class com.example.compassapp.CompassView
03-12 02:09:57.304: E/AndroidRuntime(789):  at android.view.LayoutInflater.createView(LayoutInflater.java:596)
03-12 02:09:57.304: E/AndroidRuntime(789):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687)
03-12 02:09:57.304: E/AndroidRuntime(789):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
03-12 02:09:57.304: E/AndroidRuntime(789):  at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
03-12 02:09:57.304: E/AndroidRuntime(789):  at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
03-12 02:09:57.304: E/AndroidRuntime(789):  at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
03-12 02:09:57.304: E/AndroidRuntime(789):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:270)
03-12 02:09:57.304: E/AndroidRuntime(789):  at android.app.Activity.setContentView(Activity.java:1881)
03-12 02:09:57.304: E/AndroidRuntime(789):  at com.example.compassapp.MainActivity.onCreate(MainActivity.java:12)
03-12 02:09:57.304: E/AndroidRuntime(789):  at android.app.Activity.performCreate(Activity.java:5104)
03-12 02:09:57.304: E/AndroidRuntime(789):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
03-12 02:09:57.304: E/AndroidRuntime(789):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
03-12 02:09:57.304: E/AndroidRuntime(789):  ... 11 more
03-12 02:09:57.304: E/AndroidRuntime(789): Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet]
03-12 02:09:57.304: E/AndroidRuntime(789):  at java.lang.Class.getConstructorOrMethod(Class.java:460)
03-12 02:09:57.304: E/AndroidRuntime(789):  at java.lang.Class.getConstructor(Class.java:431)
03-12 02:09:57.304: E/AndroidRuntime(789):  at android.view.LayoutInflater.createView(LayoutInflater.java:561)
03-12 02:09:57.304: E/AndroidRuntime(789):  ... 22 more
03-12 02:10:21.435: E/Trace(810): error opening trace file: No such file or directory (2)
03-12 02:10:22.214: D/AndroidRuntime(810): Shutting down VM
03-12 02:10:22.214: W/dalvikvm(810): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
03-12 02:10:22.234: E/AndroidRuntime(810): FATAL EXCEPTION: main
03-12 02:10:22.234: E/AndroidRuntime(810): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.compassapp/com.example.compassapp.MainActivity}: android.view.InflateException: Binary XML file line #12: Error inflating class com.example.compassapp.CompassView
03-12 02:10:22.234: E/AndroidRuntime(810):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
03-12 02:10:22.234: E/AndroidRuntime(810):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
03-12 02:10:22.234: E/AndroidRuntime(810):  at android.app.ActivityThread.access$600(ActivityThread.java:141)
03-12 02:10:22.234: E/AndroidRuntime(810):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
03-12 02:10:22.234: E/AndroidRuntime(810):  at android.os.Handler.dispatchMessage(Handler.java:99)
03-12 02:10:22.234: E/AndroidRuntime(810):  at android.os.Looper.loop(Looper.java:137)
03-12 02:10:22.234: E/AndroidRuntime(810):  at android.app.ActivityThread.main(ActivityThread.java:5041)
03-12 02:10:22.234: E/AndroidRuntime(810):  at java.lang.reflect.Method.invokeNative(Native Method)
03-12 02:10:22.234: E/AndroidRuntime(810):  at java.lang.reflect.Method.invoke(Method.java:511)
03-12 02:10:22.234: E/AndroidRuntime(810):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
03-12 02:10:22.234: E/AndroidRuntime(810):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
03-12 02:10:22.234: E/AndroidRuntime(810):  at dalvik.system.NativeStart.main(Native Method)
03-12 02:10:22.234: E/AndroidRuntime(810): Caused by: android.view.InflateException: Binary XML file line #12: Error inflating class com.example.compassapp.CompassView
03-12 02:10:22.234: E/AndroidRuntime(810):  at android.view.LayoutInflater.createView(LayoutInflater.java:596)
03-12 02:10:22.234: E/AndroidRuntime(810):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687)
03-12 02:10:22.234: E/AndroidRuntime(810):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
03-12 02:10:22.234: E/AndroidRuntime(810):  at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
03-12 02:10:22.234: E/AndroidRuntime(810):  at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
03-12 02:10:22.234: E/AndroidRuntime(810):  at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
03-12 02:10:22.234: E/AndroidRuntime(810):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:270)
03-12 02:10:22.234: E/AndroidRuntime(810):  at android.app.Activity.setContentView(Activity.java:1881)
03-12 02:10:22.234: E/AndroidRuntime(810):  at com.example.compassapp.MainActivity.onCreate(MainActivity.java:12)
03-12 02:10:22.234: E/AndroidRuntime(810):  at android.app.Activity.performCreate(Activity.java:5104)
03-12 02:10:22.234: E/AndroidRuntime(810):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
03-12 02:10:22.234: E/AndroidRuntime(810):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
03-12 02:10:22.234: E/AndroidRuntime(810):  ... 11 more
03-12 02:10:22.234: E/AndroidRuntime(810): Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet]
03-12 02:10:22.234: E/AndroidRuntime(810):  at java.lang.Class.getConstructorOrMethod(Class.java:460)
03-12 02:10:22.234: E/AndroidRuntime(810):  at java.lang.Class.getConstructor(Class.java:431)
03-12 02:10:22.234: E/AndroidRuntime(810):  at android.view.LayoutInflater.createView(LayoutInflater.java:561)
03-12 02:10:22.234: E/AndroidRuntime(810):  ... 22 more

现贴出代码:

1。MainActivity

 1 package com.example.compassapp;
 2 
 3 import android.os.Bundle;
 4 import android.app.Activity;
 5 import android.view.Menu;
 6 
 7 public class MainActivity extends Activity {
 8 
 9     @Override
10     protected void onCreate(Bundle savedInstanceState) {
11         super.onCreate(savedInstanceState);
12         setContentView(R.layout.main);
13         CompassView cv = (CompassView)findViewById(R.id.compassView);
14     }
15 
16     @Override
17     public boolean onCreateOptionsMenu(Menu menu) {
18         // Inflate the menu; this adds items to the action bar if it is present.
19         getMenuInflater().inflate(R.menu.main, menu);
20         return true;
21     }
22 
23 }

刚贴完这个发现怪不得初始化有问题。。。cv.setBearing(45)没写。。
2.compassView

  1 package com.example.compassapp;
  2 
  3 import android.os.Bundle;
  4 import android.app.Activity;
  5 import android.content.Context;
  6 import android.content.res.Resources;
  7 import android.graphics.Canvas;
  8 import android.graphics.Paint;
  9 import android.util.AttributeSet;
 10 import android.view.Menu;
 11 import android.view.View;
 12 
 13 public class CompassView extends View {
 14     private float bearing;
 15     private Paint makerPaint;
 16     private Paint textPaint;
 17     private Paint circlePaint;
 18     private String northString;
 19     private String eastString;
 20     private String southString;
 21     private String westString;
 22     private int textHeight;
 23     
 24     public void setBearing(float _bearing){
 25         bearing = _bearing;
 26     }
 27     
 28     public float getBearing(){
 29         return bearing;
 30     }
 31     public CompassView(Context context){
 32         super(context);
 33         initCompassView();
 34     }
 35     public CompassView(Context context, AttributeSet ats, int defaultStyle){
 36         super(context, ats, defaultStyle);
 37         initCompassView();
 38     }
 39     protected void initCompassView(){
 40         setFocusable(true);
 41         
 42         circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
 43         Resources r = this.getResources();
 44         circlePaint.setColor(r.getColor(R.color.background_color));
 45         circlePaint.setStrokeWidth(1);
 46         circlePaint.setStyle(Paint.Style.FILL_AND_STROKE);
 47         northString = r.getString(R.string.cardinal_north);
 48         eastString = r.getString(R.string.cardinal_east);
 49         southString = r.getString(R.string.cardinal_south);
 50         westString = r.getString(R.string.cardinal_west);
 51         
 52         textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
 53         textPaint.setColor(r.getColor(R.color.text_color));
 54         textHeight = (int)textPaint.measureText("yY");
 55         
 56         makerPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
 57         makerPaint.setColor(r.getColor(R.color.marker_color));
 58         
 59     }
 60 
 61     @Override
 62     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
 63         int measureWidth = measure(widthMeasureSpec);
 64         int measureHeight = measure(heightMeasureSpec);
 65         int d = Math.min(measureWidth, measureHeight);
 66         setMeasuredDimension(d,d);
 67     }
 68     
 69     private int measure(int measureSpec){
 70         int result = 0;
 71         int specMode = MeasureSpec.getMode(measureSpec);
 72         int specSize = MeasureSpec.getSize(measureSpec);
 73         
 74         if (specMode == MeasureSpec.UNSPECIFIED){
 75             result = 200;
 76         } else{
 77             result = specSize;
 78         }
 79         return result;
 80     }
 81     
 82     @Override
 83     protected void onDraw(Canvas canvas){
 84         int px = getMeasuredWidth()/2;
 85         int py = getMeasuredHeight()/2;
 86         int radius = Math.min(px, py);
 87         canvas.drawCircle(px, py, radius, circlePaint);
 88         canvas.save();
 89         canvas.rotate(-bearing,px,py);
 90         
 91         int textWidth = (int)textPaint.measureText("W");
 92         int cardinalX = px - textWidth/2;
 93         int cardinalY = py - radius + textHeight;
 94         
 95         for(int i=0; i<24; i++){
 96             canvas.drawLine(px, py-radius, px, py-radius+10, makerPaint);
 97             canvas.save();
 98             canvas.translate(0, textHeight);
 99             
100             if (i%6 ==0){
101                 String dirString = "";
102                 switch (i) {
103                 case (0) :{
104                     dirString = northString;
105                     int arrowY = 2*textHeight;
106                     canvas.drawLine(px, arrowY, px-5, 3*textHeight, makerPaint);
107                     break;
108                 }
109                 case (6): dirString = eastString; break;
110                 case (12): dirString = southString; break;
111                 case (18): dirString = westString;break;
112                 }
113                 canvas.drawText(dirString, cardinalX, cardinalY, textPaint);
114             }
115             
116             else if (i % 3 == 0){
117                 String angle = String.valueOf(i*15);
118                 float angleTextWidth = textPaint.measureText(angle);
119                 
120                 int angleTextX = (int)(px - angleTextWidth/2);
121                 int angleTextY = py - radius + textHeight;
122                 canvas.drawText(angle, angleTextX, angleTextY, textPaint);
123             }
124             canvas.restore();
125             canvas.rotate(15,px,py);
126         }
127         canvas.restore();
128     }
129     
130     
131 
132 }

3.manifest

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 3     package="com.example.compassapp"
 4     android:versionCode="1"
 5     android:versionName="1.0" >
 6 
 7     <uses-sdk
 8         android:minSdkVersion="8"
 9         android:targetSdkVersion="17" />
10 
11     <application
12         android:allowBackup="true"
13         android:icon="@drawable/ic_launcher"
14         android:label="@string/app_name"
15         android:theme="@style/AppTheme" >
16         <activity
17             android:name="com.example.compassapp.MainActivity"
18             android:label="@string/app_name" >
19             <intent-filter>
20                 <action android:name="android.intent.action.MAIN" />
21 
22                 <category android:name="android.intent.category.LAUNCHER" />
23             </intent-filter>
24         </activity>
25     </application>
26 
27 </manifest>

4.main.xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:tools="http://schemas.android.com/tools"
 4     android:orientation="vertical"
 5     android:layout_width="fill_parent"
 6     android:layout_height="fill_parent">
 7 
 8     
 9     <com.example.compassapp.CompassView
10      xmlns:android = "http://schemas.android.com/apk/res/android"
11         android:id="@+id/compassView"
12         android:layout_width="fill_parent"
13         android:layout_height = "fill_parent"
14         />
15    
16 
17 </LinearLayout>

 最后将activity这样改,就好了。。。即使我使用下一行cv初始化将7,8行顺序呼唤都会出错nullpointerexception 为什么??

1 @Override
2     protected void onCreate(Bundle savedInstanceState) {
3         super.onCreate(savedInstanceState);
4         CompassView cv = new CompassView(this);
5 //        CompassView cv = (CompassView)findViewById(R.id.compassView);
6         
7         setContentView(cv);
8         cv.setBearing(45);

 虽然work了但是还是不甘。仔细看了catlog NoSuchMethodException:<init>[class android.Content.Context, interface android.util.AttribureSet]

所以是少了以context 和 attributeSet为参数的构造函数,加上

public CompassView(Context context, AttributeSet ats){
        super(context, ats);
        initCompassView();
    }

但是为什么不认我之前写的那两个构造函数呢?http://blog.csdn.net/z103594643/article/details/6755017

原文地址:https://www.cnblogs.com/lauraxia/p/2955191.html