Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.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
Android 为什么无效不起作用?_Android - Fatal编程技术网

Android 为什么无效不起作用?

Android 为什么无效不起作用?,android,Android,我试图画一个矩形,在这里我首先从Activity类中提供它的值,然后尝试从另一个类中更改它的坐标。。就我而言,逻辑是正确的,但无效无效无效。。我做了大量的研究,但还是没能成功 RectangleActivity.java public class RectangleActivity extends Activity { private Point dStart = null; private Point dEnd = null; final private Handler hand

我试图画一个矩形,在这里我首先从Activity类中提供它的值,然后尝试从另一个类中更改它的坐标。。就我而言,逻辑是正确的,但无效无效无效。。我做了大量的研究,但还是没能成功

RectangleActivity.java

public class RectangleActivity extends Activity {

  private Point dStart = null;
  private Point dEnd = null;
  final private Handler handler = new Handler();
  Check check = new Check(this);
  Draw draw ;

  Runnable mUpdate = new Runnable()
    {
    public void run()
    {           
     Toast.makeText(getApplicationContext(), "update Called", Toast.LENGTH_LONG).show();
      check.update();           
    }
 };
      @Override
       public void onCreate(Bundle savedInstanceState) {        
        super.onCreate(savedInstanceState);
        dStart = new Point(0,0);
        dEnd = new Point(60,60);
        draw = new Draw(this,dStart,dEnd);
        setContentView(draw);
        handler.postDelayed(mUpdate, 4000); 
      } 
 }
    public class Check 
    {

  private Point start = new Point(80,80);
  private Point end = new Point(150,150);
  private Context context;

  public Check(Context context)
  {
    this.context =context;      
  } 
    void update() 
  { 
    Log.d("Aditi", "Update Called");
    Draw draw = new Draw(context);
    draw.reDraw(start,end);     
  } 
 }
    public class Draw extends View
    {   
 private Paint paint = null;
 private Point start = null;
 private Point end = null;  

 public Draw(Context context) 
  {
    super(context);     
    paint();    
  }     
  public Draw(Context context, Point start, Point end) 
  {
    super(context);

    this.start= start;
    this.end = end;
    paint();
  } 

   protected void onDraw(Canvas canvas)
   {
    super.onDraw(canvas);
    canvas.drawRect(start.x,start.y,end.x,end.y,paint);
    Log.d("Aditi", "OnDraw Called");
    System.out.println("StartX in ondraw is: "+start.x);
    System.out.println("StartY in ondraw is: "+start.y);
    System.out.println("EndX in ondraw is: "+end.x);
    System.out.println("EndY in ondraw is: "+end.y);    
  }

  public void reDraw(Point Start, Point End)
  {
    Log.d("Aditi", "Redraw Called");
    this.start = Start;
    this.end = End;
    invalidate();
    Log.d("Aditi", "Invalidate  Called");
    System.out.println("StartX in redraw is: "+start.x);
    System.out.println("StartY in redraw is: "+start.y);
    System.out.println("EndX in redraw is: "+end.x);
    System.out.println("EndY in redraw is: "+end.y);        
   }    
     public void paint()
   {
    paint= new Paint();     
    paint.setColor(Color.YELLOW);
    paint.setAntiAlias(true);
    paint.setStyle(Paint.Style.FILL_AND_STROKE);
  }   
}
检查.java

public class RectangleActivity extends Activity {

  private Point dStart = null;
  private Point dEnd = null;
  final private Handler handler = new Handler();
  Check check = new Check(this);
  Draw draw ;

  Runnable mUpdate = new Runnable()
    {
    public void run()
    {           
     Toast.makeText(getApplicationContext(), "update Called", Toast.LENGTH_LONG).show();
      check.update();           
    }
 };
      @Override
       public void onCreate(Bundle savedInstanceState) {        
        super.onCreate(savedInstanceState);
        dStart = new Point(0,0);
        dEnd = new Point(60,60);
        draw = new Draw(this,dStart,dEnd);
        setContentView(draw);
        handler.postDelayed(mUpdate, 4000); 
      } 
 }
    public class Check 
    {

  private Point start = new Point(80,80);
  private Point end = new Point(150,150);
  private Context context;

  public Check(Context context)
  {
    this.context =context;      
  } 
    void update() 
  { 
    Log.d("Aditi", "Update Called");
    Draw draw = new Draw(context);
    draw.reDraw(start,end);     
  } 
 }
    public class Draw extends View
    {   
 private Paint paint = null;
 private Point start = null;
 private Point end = null;  

 public Draw(Context context) 
  {
    super(context);     
    paint();    
  }     
  public Draw(Context context, Point start, Point end) 
  {
    super(context);

    this.start= start;
    this.end = end;
    paint();
  } 

   protected void onDraw(Canvas canvas)
   {
    super.onDraw(canvas);
    canvas.drawRect(start.x,start.y,end.x,end.y,paint);
    Log.d("Aditi", "OnDraw Called");
    System.out.println("StartX in ondraw is: "+start.x);
    System.out.println("StartY in ondraw is: "+start.y);
    System.out.println("EndX in ondraw is: "+end.x);
    System.out.println("EndY in ondraw is: "+end.y);    
  }

  public void reDraw(Point Start, Point End)
  {
    Log.d("Aditi", "Redraw Called");
    this.start = Start;
    this.end = End;
    invalidate();
    Log.d("Aditi", "Invalidate  Called");
    System.out.println("StartX in redraw is: "+start.x);
    System.out.println("StartY in redraw is: "+start.y);
    System.out.println("EndX in redraw is: "+end.x);
    System.out.println("EndY in redraw is: "+end.y);        
   }    
     public void paint()
   {
    paint= new Paint();     
    paint.setColor(Color.YELLOW);
    paint.setAntiAlias(true);
    paint.setStyle(Paint.Style.FILL_AND_STROKE);
  }   
}
Draw.java

public class RectangleActivity extends Activity {

  private Point dStart = null;
  private Point dEnd = null;
  final private Handler handler = new Handler();
  Check check = new Check(this);
  Draw draw ;

  Runnable mUpdate = new Runnable()
    {
    public void run()
    {           
     Toast.makeText(getApplicationContext(), "update Called", Toast.LENGTH_LONG).show();
      check.update();           
    }
 };
      @Override
       public void onCreate(Bundle savedInstanceState) {        
        super.onCreate(savedInstanceState);
        dStart = new Point(0,0);
        dEnd = new Point(60,60);
        draw = new Draw(this,dStart,dEnd);
        setContentView(draw);
        handler.postDelayed(mUpdate, 4000); 
      } 
 }
    public class Check 
    {

  private Point start = new Point(80,80);
  private Point end = new Point(150,150);
  private Context context;

  public Check(Context context)
  {
    this.context =context;      
  } 
    void update() 
  { 
    Log.d("Aditi", "Update Called");
    Draw draw = new Draw(context);
    draw.reDraw(start,end);     
  } 
 }
    public class Draw extends View
    {   
 private Paint paint = null;
 private Point start = null;
 private Point end = null;  

 public Draw(Context context) 
  {
    super(context);     
    paint();    
  }     
  public Draw(Context context, Point start, Point end) 
  {
    super(context);

    this.start= start;
    this.end = end;
    paint();
  } 

   protected void onDraw(Canvas canvas)
   {
    super.onDraw(canvas);
    canvas.drawRect(start.x,start.y,end.x,end.y,paint);
    Log.d("Aditi", "OnDraw Called");
    System.out.println("StartX in ondraw is: "+start.x);
    System.out.println("StartY in ondraw is: "+start.y);
    System.out.println("EndX in ondraw is: "+end.x);
    System.out.println("EndY in ondraw is: "+end.y);    
  }

  public void reDraw(Point Start, Point End)
  {
    Log.d("Aditi", "Redraw Called");
    this.start = Start;
    this.end = End;
    invalidate();
    Log.d("Aditi", "Invalidate  Called");
    System.out.println("StartX in redraw is: "+start.x);
    System.out.println("StartY in redraw is: "+start.y);
    System.out.println("EndX in redraw is: "+end.x);
    System.out.println("EndY in redraw is: "+end.y);        
   }    
     public void paint()
   {
    paint= new Paint();     
    paint.setColor(Color.YELLOW);
    paint.setAntiAlias(true);
    paint.setStyle(Paint.Style.FILL_AND_STROKE);
  }   
}

请随时指出我做错了什么。。提前谢谢。

如果这对你不起作用,恐怕我会的。请尝试调用invalidate方法onDraw()


在上面的问题中,在onCreate()中,您使用draw=newdraw(this,dStart,dEnd)进行查看 然后在setContentView(draw)中使用,但是当update()调用时,您再次使用draw draw=new draw创建了一个draw对象(this,dStart,dEnd)并在第二个draw对象上调用draw.reDraw(start,end),这样setContentView()中使用的实例就不会失效,第二个draw视图对象也会失效,但它没有传递到setContentView(),所以它在ui上不可见:您的解决方案只是

    void update() {
    //    Draw draw = new Draw(context);  //remove this
        draw.reDraw(start, end);
    }

如果从应用程序主线程以外的线程使视图无效,则该视图将无法工作,您必须调用postInvalidate()而不是invalidate()。

我可以通过调用postInvalidate()方法,即draw.postInvalidate()从Check.java调用onDraw方法它用更新后的矩形坐标调用onDraw方法。。