2012-04-22 86 views
1

我有一个包含自定义视图中的XML布局:无效()不更改自定义视图的内容立即

<LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="0dip" 
     android:orientation="vertical" 
     android:layout_weight="50" 
    > 
     <org.example.sudoku.PuzzleView 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:background="@drawable/puzzlebackground" 
      android:id="@+id/puzzleId"/> 

    </LinearLayout> 

我有一个的活动,设置此布局的内容,则调用一个对话框,用户输入,然后在PuzzleView中调用一个函数来最终更改PuzzleView的内容。问题在于,在Dialog解散之后,该更改没有被重新绘制。相反,它会重新绘制来自用户的下一个其他输入。 下面是一些代码片断,可以帮助你:

Game.java:

// ... 
public void showKeypadOrError(int x, int y) 
{ 
    int tiles[] = getUsedTiles(x,y); 
    if (tiles.length == 9) 
    { 
     Toast toast = Toast.makeText(this, R.string.no_moves_label, Toast.LENGTH_SHORT); 
     toast.setGravity(Gravity.CENTER, 0, 0); 
     toast.show(); 
    }else 
    { 
     Log.d(TAG, "showKeypad: used=" + toPuzzleString(tiles)); 
     Dialog v = new Keypad(this, this.puzzleView, x, y); 
     v.show(); 
    } 
} 
public void setTile(int x, int y, int value) { 
    puzzle[y * 9 + x] = value; 
} 

Keypad.java:

private void setListeners() 
{ 
    for (int i = 0; i < keys.length; i++) 
    { 
     final int t = i + 1; 
     keys[i].setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) 
      { 
       returnResult(t); 
      } 
     }); 
    } 
} 

private void returnResult(int tile) 
{ 
    puzzleView.setSelectedTile(selX, selY, tile); 
    puzzleView.invalidate(); 
    dismiss(); 
} 

最后,PuzzleView.java

public void setSelectedTile(int X, int Y, int tile) { 
    game.setTile(X, Y, tile); 
    //this.invalidate();// may change hints 
} 

我发现了一个类似于我的问题的问题,但我无法弄清楚什么是解决方案离子:

How to invalidate() on return from a dialog?

非常感谢您对您的帮助! 编辑:添加更多的代码 - 希望这帮助: PuzzleView.java

// Handle input in touch mode 
@Override 
public boolean onTouchEvent(MotionEvent event) { 
    if (event.getAction() != MotionEvent.ACTION_DOWN) { 
     return super.onTouchEvent(event); 
    } 

    // Allow player to choose the tile that defined by game 
    // But only allow the user to modify the tiles that are blank 
    select((int) (event.getX()/width), 
      (int) (event.getY()/height)); 

    int[] predefined = new int[81]; 
    // Get the tile that are not blank (predefined by game) 
    predefined = game.getPredefinedTileFromPuzzle(); 
    // Check if the selected tile is whether predefined or not 
    if (predefined[selY * 9 + selX] == 1) { 
     return true; 
    } 
    //Call the Dialog input from Game.java 
    game.showKeypadOrError(selX, selY); 
    Log.i(TAG, "Right before terminate onTouchEvent()"); 
    return true; 
} 
+0

只是用于测试的缘故,做'returnResult(4)'地方比别的clicklistener其他...硬编码的瓷砖值,看看是否无效发生... – Ronnie 2012-04-23 13:58:45

回答

1

在对话框关闭后,您应该无效。

落实DialogInterface.OnDismissListener界面和OnDismiss回调无效。

Dialog v = new Keypad(this, this.puzzleView, x, y); 

    v.setOnDismissListener(new OnDismissListener() { 
    @Override 
     public void onDismiss(final DialogInterface arg0) { 
      puzzleView.postInvalidate(); 
     } 
    }); 

    v.show(); 
+0

莫非你请多解释一下?我尽量照你说的去做,但不起作用。我应该在哪里实现DialogInterface.OnDismissListener? – 2012-04-23 08:37:55

+0

添加代码示例.. – Ronnie 2012-04-23 08:42:04

+0

谢谢你的快速回复,我刚才说PuzzleView.java的更多代码(重写的onTouchEvent)。它对你有帮助吗? – 2012-04-23 08:46:43

0

只是做puzzleView.requestLayout();