Как сделать недействительной () при возврате из диалога? - PullRequest
0 голосов
/ 03 февраля 2011

У меня есть холст для рисования с 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();     

Ответы [ 2 ]

2 голосов
/ 03 февраля 2011

Не могли бы вы опубликовать некоторый код вашей ситуации с помощью диалогового окна и 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();

Ошибка, вероятно, возникнет из контекста, который вы используете для аннулирования, но необходима дополнительная информация об изменениях в холсте, который вы делаете, и код вашего диалогового окна.

//////////////////////////////// Edit

похоже, что существует проблема между локальной и глобальной переменной View myBoard.

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

View myBoard в onCreate инициализируется локально, но глобальный View myBoard не был инициализирован из-за локальной области видимости. У вас есть две переменные myBoard, и только одна инициализирована. Чтобы исправить это быстро, я бы изменил:

View myBoard = new NewBoard(this);

до

myBoard = new NewBoard(this); 
0 голосов
/ 03 февраля 2011

Две возможности:

  • сделать диалог неотменяемым
  • установить OnCancelListener для диалогового окна, которое затем вызовет invalidate ().
...