Android: перехват ключа назад - PullRequest
3 голосов
/ 09 июня 2011

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

Я подумал о следующей структуре:

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event)  
    {    
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) 
        { 
         // ask user if he really wants to exit
         // no --> return true;
         // yes --> return super.onKeyDown(keyCode, event);
         //manually entering either of the return values works fine
        }   
    return super.onKeyDown(keyCode, event);
    }

Часть «Спроси пользователя», которую я хотел реализовать с помощью диалогового окна с предупреждением.Моя проблема в том, что теперь отображается диалоговое окно с предупреждением, но метод onKeyDown работает до конца, пока отображается диалоговое окно с предупреждением, и что в диалоговом окне с предупреждением я не знаю, как сказать системе передать правильное возвращаемое значение.

Полный код, который я имел в виду:

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event)  
    {    
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) 
        { 

            alertDialog = new AlertDialog.Builder(this).create();
            alertDialog.setTitle("Tile");
            alertDialog.setMessage("data lost, are you sure?");

            alertDialog.setButton(-1, getString(R.string.yes), new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialog, int which) 
                {
                    return;
                    //I only can return without a boolean value here.                   }
            });

            alertDialog.setButton(-2, getString(R.string.no), new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialog, int which) 
                {
                    return;
                }
            });

            alertDialog.show();
        }   
        return super.onKeyDown(keyCode, event);
    }

Спасибо, А.

Ответы [ 2 ]

3 голосов
/ 09 июня 2011

Когда пользователь нажимает обратно, появляется ваше диалоговое окно.

С onKeyDown теперь разобрались, поэтому вы возвращаете true.

Теперь ваш диалог показывает,

, когда вынажмите да, вы хотите имитировать кнопку возврата, что finish () ;

, когда вы нажимаете no, вы просто закрываете диалоговое окно, и действие продолжается

Вам понадобится:

 @Override
public boolean onKeyDown(int keyCode, KeyEvent event)  
{    
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) 
    { 

        alertDialog = new AlertDialog.Builder(this).create();
        alertDialog.setTitle("Tile");
        alertDialog.setMessage("data lost, are you sure?");

        alertDialog.setButton(-1, getString(R.string.yes), new DialogInterface.OnClickListener()
        {
            @Override
            public void onClick(DialogInterface dialog, int which) 
            {
                finish(); // or yourContext.finish();
                //I only can return without a boolean value here.                   
            }
        });

        alertDialog.setButton(-2, getString(R.string.no), new DialogInterface.OnClickListener()
        {
            @Override
            public void onClick(DialogInterface dialog, int which) 
            {
                // do nothing dialog will dismiss
            }
        });

        alertDialog.show();
        return true; //meaning you've dealt with the keyevent
    }   
    return super.onKeyDown(keyCode, event);
}
0 голосов
/ 09 июня 2011

alertDialog.show ();должен вызываться в течение одного нажатия кнопки Нет

...