如何调用一个充满来自另一个类的元素的数组?

时间:2013-05-05 10:59:30

标签: java android arrays

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

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

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

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

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;
        }
    });
  }
}

1 个答案:

答案 0 :(得分: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++;
}