0

OnTouchListenerを呼び出す描画キャンバスがありAlertDialogます。

ダイアログで、キャンバスの基礎となるデータをリセットします(またはユーザーに依存しません)。キャンバスを使用してキャンバスに戻ると、dialog.cancel()再描画されず、再描画されます。
これは、ユーザーがキャンバスをクリックして再描画を行わなければならないことを意味します - よくありません!

ダイアログは非同期で実行されるためinvalidate()、変更された基になるデータをダイアログが返す前に、キャンバス内で への呼び出しが完了します。ダイアログ ボタン コード内からキャンバスを無効化または参照しようとすると、エラーが発生します。私はキャッチ22にいるようです!

誰でもアドバイスをもらえますか?

ダイアログコード:

case DIALOG_NEW_ID:
    AlertDialog.Builder builder5 = new AlertDialog.Builder(this);
    builder5.setMessage("     WARNING" +
            "\nYour current game will be lost")
    .setCancelable(false)
    .setPositiveButton("Cancel", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {                   
            dialog.cancel();
        }
    })              
    .setNegativeButton("Continue", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
            cells.reset();
            gameMode = 0;
            dialog.cancel();
        }
    });
    AlertDialog alert5 = builder5.create();             
    alert5.setOnDismissListener(new DialogInterface.OnDismissListener() { 
        public void onDismiss( DialogInterface dialog) { 
            Log.d(TAG, "Dialog cancelled");// debug log entry 
            //myBoard.invalidate();
        }
    });     
    dialog = alert5;                
    break;

onTouchキャンバス内のダイアログ呼び出しコード:

    case MODE_SOLUTION:
        break;
    default:                            
        showDialog(DIALOG_NEW_ID);
        invalidate();
}// end switch  

メイン クラスのセットアップ:

public class SudokuGame extends Activity {
static final int DIALOG_OPEN_ID = 0;
static final int DIALOG_INFO_ID = 1;
static final int DIALOG_FAIL_ID = 2;
static final int DIALOG_SAVE_ID = 3;
static final int DIALOG_NEW_ID = 4;
static final int MODE_ENTRY = 0;
static final int MODE_PLAY = 1;
static final int MODE_SHOW_ERRORS = 3;
static final int MODE_SOLUTION = 4;
final String TAG = "Game";
int  gameMode;
SKU cells;
View myBoard;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_LEFT_ICON);
    View myBoard = new NewBoard(this);        
    setContentView(myBoard);
    setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, R.drawable.ic_launcher);
    showDialog(DIALOG_OPEN_ID);        
}// end onCreate

    protected Dialog onCreateDialog(int id) {

メインクラスにネストされたクラス NewBoard:

    class NewBoard extends View implements OnTouchListener{
    int cW;  // canvas width
    int cH;  // canvas height
    int cellSize,textSize;
    int boardX,boardY;  
    int runner, tX, tY,pX,pY,selectorX,selectorY;
    int gap ;
    int btn1X,btn1Y, selected;
    int infoButtonX, infoButtonY,quitButtonX,quitButtonY;
    boolean btn1Pressed, btn2Pressed,  btn3Pressed, btn4Pressed, btn5Pressed;
    String btn1,btn2,btn3,btn4,btn5;

    public NewBoard(Context context){ // NewBoard Constructor
        super(context);
        this.setOnTouchListener(this);  
        cells = new SKU();
        readStateStore();
    }// end NewBoard Constructor

    @Override 
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint paint = new Paint();  
        Rect textRect = new Rect();     
4

2 に答える 2

2

ダイアログボックスとinvalidate()を使用して状況のコードを投稿すると、エラーメッセージが返されますか?

次のことができなかった理由がわかりません(mapViewを無効にするダイアログボックス):

    AlertDialog.Builder builderAccountInfo = new AlertDialog.Builder(this);
        builderAccountInfo.setMessage("TEST")
        .setCancelable(false)
        .setTitle("TEST")
        .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
       public void onClick(DialogInterface dialog, int id) {
            changeUserCanvas();
            mapView.invalidate();
            dialog.cancel();
       }
   });
        AlertDialog alertAccountInfo = builderAccountInfo.create();

        alertAccountInfo.show();

エラーは、無効化に使用しているコンテキストが原因である可能性がありますが、作成しているキャンバスへの変更とダイアログボックスのコードに関する詳細情報が必要です。

////////////////////////////////編集

ViewmyBoardのローカル変数とグローバル変数の間に問題があるようです。

public class SudokuGame extends Activity {
static final int DIALOG_OPEN_ID = 0;
static final int DIALOG_INFO_ID = 1;
static final int DIALOG_FAIL_ID = 2;
static final int DIALOG_SAVE_ID = 3;
static final int DIALOG_NEW_ID = 4;
static final int MODE_ENTRY = 0;
static final int MODE_PLAY = 1;
static final int MODE_SHOW_ERRORS = 3;
static final int MODE_SOLUTION = 4;
final String TAG = "Game";
int  gameMode;
SKU cells;
View myBoard;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_LEFT_ICON);
    View myBoard = new NewBoard(this);        
    setContentView(myBoard);
    setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, R.drawable.ic_launcher);
    showDialog(DIALOG_OPEN_ID);        
}// end onCreate

onCreateのViewmyBoardはローカルで初期化されていますが、ローカルスコープのため、グローバルViewmyBoardは初期化されていません。2つのmyBoard変数があり、1つだけが初期化されます。これをすばやく修正するには、次のように変更します。

View myBoard = new NewBoard(this);

myBoard = new NewBoard(this); 
于 2011-02-03T16:32:27.837 に答える
0

2 つの可能性:

  • ダイアログをキャンセル不可にする
  • ダイアログの OnCancelListener を設定すると、invalidate() が呼び出されます。
于 2011-02-03T18:31:22.383 に答える