Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:CustomView在应该对方向做出反应时是静态的_Java_Android_Xml_Android Layout - Fatal编程技术网

Java Android:CustomView在应该对方向做出反应时是静态的

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”类中呈现。如果我在“显示指南针”活动中设置contentView,如下所示:
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?!