2012-04-22 4 views
1

カスタムビューの内容を変更しません。これはPuzzleViewの機能を呼び出して、PuzzleViewのコンテンツを最終的に変更します。問題は、ダイアログが終了した直後に変更が再描画されていないことです。代わりに、ユーザーからの次の他の入力時に再描画されます。ここ はあなたを助けるかもしれないコードの一部抜粋です:無効化は、()私は、カスタムビューを含むXMLレイアウトを持ってすぐに

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

タイル値をハードコーディングし、無効化が起こるかどうか... – Ronnie

答えて

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はどこで実装すればよいですか? –

+0

コードサンプルを追加しました。 – Ronnie

+0

すぐにお返事ありがとうございます。私は、PuzzleView.java(onTouchEventをオーバーライド)のコードを追加しました。それはあなたを助けますか? –

0

ただ単にテストのために、clicklistener以外の(4) `どこか` returnResultを行う... puzzleView.requestLayout();

関連する問題