2013-05-05 48 views
0

如何从另一个名为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; 
     } 
    }); 
    } 
} 
+0

这不能与一个存取方法来实现? – christopher 2013-05-05 11:14:59

+0

改变你的凌乱'while'为'for'首先...和'如果(m <81)'无用... – johnchen902 2013-05-05 11:28:07

+0

@ johnchen902不是没用的...看看他是如何在'onDraw'中创建rect数组的,重置'm' ...没有测试他会有'IndexOutOfBoundsException'。这么丑陋:是的,但没用:不:-) – 2013-05-05 11:29:48

回答

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++; 
} 
相关问题