Java Android:CustomView在应该对方向做出反应时是静态的
在我的应用程序中,我有一个基本的指南针,它在“compassView”类中呈现。如果我在“显示指南针”活动中设置contentView,如下所示:Java Android:CustomView在应该对方向做出反应时是静态的,java,android,xml,android-layout,Java,Android,Xml,Android Layout,在我的应用程序中,我有一个基本的指南针,它在“compassView”类中呈现。如果我在“显示指南针”活动中设置contentView,如下所示:compassView=new compassView(此);setContentView(compassView)它工作正常,指向北方,但是如果我将内容视图设置为setContentView(activity\u display\u compass)它将渲染指南针和我可能拥有的任何文本视图,但指南针是静态的;针不动了。我不知道这是什么原因造成的。如果
compassView=new compassView(此);setContentView(compassView)代码>它工作正常,指向北方,但是如果我将内容视图设置为setContentView(activity\u display\u compass)
它将渲染指南针和我可能拥有的任何文本视图,但指南针是静态的;针不动了。我不知道这是什么原因造成的。如果您能提供任何指导,我们将不胜感激
xml
罗盘视图
public class CompassView extends View{
private Paint paint;
private double position = 0;
public CompassView(Context context) {
super(context, null);
init();
}
public CompassView(Context context, AttributeSet attrs) {
super(context,attrs, 0);
init();
}
public CompassView(Context context, AttributeSet attrs,int defStyle) {
super(context,attrs, defStyle);
init();
}
private void init() {
paint = new Paint();
paint.setAntiAlias(true);
paint.setStrokeWidth(5);
paint.setTextSize(25);
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.RED);
}
@Override
protected void onDraw(Canvas canvas) {
int xPoint = getMeasuredWidth() / 2;
int yPoint = getMeasuredHeight() / 2;
float radius = (float) (Math.max(xPoint, yPoint) * 0.6);
canvas.drawCircle(xPoint, yPoint, radius, paint);
canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), paint);
// 3.143 is a good approximation for the circle
canvas.drawLine(xPoint,
yPoint,
(float) (xPoint + radius
* Math.sin((double) (-position) / 180 * 3.143)),
(float) (yPoint - radius
* Math.cos((double) (-position) / 180 * 3.143)), paint);
canvas.drawText(String.valueOf(position), xPoint, yPoint, paint);
}
public void updateDirection(double azimuth) {
this.position = azimuth;
invalidate();
}
}
您的问题很简单,当您第一次编写应用程序时,您正在通过以下方式以编程方式创建CompassView
:
compassView = new CompassView(this);
setContentView(compassView);
当您更改为使用XML布局时,第一行可能已被删除。但是,您仍然需要分配compassView
成员变量,因为您在SensorEventListener
的onSensorChanged()
方法中使用它。您得到了一个NullPointerException
(您可以通过查看LogCat看到)
因此,在onCreate()
方法中,设置内容视图后,请记住执行以下操作:
setContentView(R.layout.activity_display_compass);
compassView = (CompassView)findViewById(R.id.compassView); // <- missing?!
setContentView(R.layout.activity\u display\u compass);
compassView=(compassView)findViewById(R.id.compassView)//
compassView = new CompassView(this);
setContentView(compassView);
setContentView(R.layout.activity_display_compass);
compassView = (CompassView)findViewById(R.id.compassView); // <- missing?!