0

如何从另一个名为 MainView 的类中获取填充到 DrawView 类中的矩形数组 r[] 的元素?

我尝试了几种解决方案,但要么我只得到一个填充了 DrawView 类数组的最后一个元素的数组,要么是空指针异常。

例如下面的代码,当我尝试将数组从 DrawView 导出到 MainView(在循环内,r[i]=drawView.r[i])时,它给出了一个完全填充了 DrawView 矩形数组的最后一个元素的数组。但我想将与我在 DrawView 中填写的数组完全相同的数组导出到 MainView。

任何想法我应该改变什么?

public class DrawView extends View {  
   public Rect [] r = new Rect[81];
   Rect r2= new Rect(left, top, right, bottom);
   int m=0;
   @Override
   public void onDraw(Canvas canvas) {
     //...........some calculations of variables leftPosFirst etc.......//
     int i=0;
     while(i<9){
         int j=0;
         while(j<9){        
             try{
                if(m<81){
                    r2.left=leftPosFirst+1;
                    r2.top=(heightRect+heightRect*j)+1;
                    r2.right=rightPosFirst-1;
                    r2.bottom=(heightRect+heightRect*(j+1))-1;
                    r[m]=r2;
                    m++;
                }
             } catch (Exception ex){}
             j++;
         }
         i++;
     }
  } 
} 

MainView.java 类:

public class MainActivity extends Activity implements OnTouchListener{
  DrawView drawView;
  int m=0;
  Rect[] r = new Rect[81];
  @Override
  public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     drawView = new DrawView(this);
     setContentView(drawView);
     drawView.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View arg0, MotionEvent arg1) {
            switch (arg1.getAction()) {
                case MotionEvent.ACTION_DOWN: {
                    int i;
                    for (i=0; i<81; i++) {
                       try{
                         r[i] = drawView.r[i];
                         System.out.println(r[i]);
                       } catch(Exception e){}
                    }
                    return true;
                }
            }
            return false;
        }
    });
  }
}
4

1 回答 1

0

有一件事你应该很好理解:java 中引用了对象。也就是说,如果我编写以下代码段:

Rect r[] = new Rect[2];
Rect r2 = new Rect(0, 0, 1, 1);
r[0] = r2;
r2.right = 2;
r[1] = r2;

两者都r[0]引用r[1]同一个对象。因此,如果你这样做

System.out.println(r[0].right);

你会看到打印出来2的,而不是1.

您需要做的是每次都创建一个新对象,而不是修改同一个对象。

利用

if(m<81){
    r2 = new Rect(leftPosFirst+1,
                  heightRect+heightRect*j)+1,
                  rightPosFirst-1,
                  heightRect+heightRect*(j+1))-1);
    r[m]=r2;
    m++;
}
于 2013-05-05T11:03:57.920 回答