1

View.OnKeyListenerユーザーが戻るボタンを押してダイアログをポップアップするときにキャッチできるように実装されたアクティビティがあります。以前は、問題なく動作していました。しかし最近、それが機能しなくなり、アプリはonKey[戻る] ボタンをキャッチする方法がないように見せかけるだけでした。onKey変更を加えてからメソッドにほとんど触れていないため、理由がわからないようです。代わりに使用してみOnBackPressed()ましたが、何も解決せず、実際には奇妙で予測不可能な動作が発生しました。私のアプリがシステムに戻るボタンの支配を任せているように見える理由を理解するのを手伝ってくれる人はいますか?

私の実装の重要な部分は次のとおりです。

import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import com.actionbarsherlock.view.MenuInflater;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.KeyEvent;
import android.view.View;

public class NagTasksAddTasksActivity extends SherlockFragmentActivity implements View.OnKeyListener {
    //various parameters
    public void onCreate(Bundle savedInstanceBundle)
    {
        super.onCreate(savedInstanceBundle);
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
        String setTheme = prefs.getString("themeselect", "Dark Overflow");
        if (setTheme.toLowerCase().contentEquals("dark overflow")){
            setTheme(R.style.Theme_Sherlock_ForceOverflow);
        } else if (setTheme.toLowerCase().contentEquals("light overflow")){
            setTheme(R.style.Theme_Sherlock_Light_ForceOverflow);
            isDarkThemeUsed = false;
        } else if (setTheme.toLowerCase().contentEquals("dark menu")){
            setTheme(R.style.Theme_Sherlock);
        } else if (setTheme.toLowerCase().contentEquals("light menu")){
            setTheme(R.style.Theme_Sherlock_Light);
            isDarkThemeUsed = false;
        }
        setContentView(R.layout.createtasklayout);
        ActionBar actionBar = getSupportActionBar();
        setTitle(R.string.newTask);

    }
    ...
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK)
        {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setCancelable(true);
            builder.setTitle(R.string.wait);
            builder.setMessage(R.string.confirmbackkey);
            builder.setPositiveButton(R.string.save, new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    //stuff
                    dialog.dismiss();
                }
            });
            builder.setNegativeButton(R.string.discard, new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    AlertDialog.Builder subBuilder = new AlertDialog.Builder(getParent());
                    subBuilder.setCancelable(true);
                    subBuilder.setTitle(R.string.wait);
                    subBuilder.setMessage(R.string.confirmdiscard);
                    subBuilder.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            //more stuff
                            dialog.dismiss();
                        }
                    });
                    subBuilder.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.cancel();
                        }
                    });
                    dialog.dismiss();
                    subBuilder.create().show();
                }
            });
            builder.setNeutralButton(R.string.cancel, new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });
            builder.create().show();
            return true;
        }
        return false;
    }
}
4

3 に答える 3

4

戻るボタンをキャッチするもう 1 つの方法は、Activity で dispatchKeyEvent メソッドを使用することです (View.OnKeyListener を実装する必要はありません)。これは毎回うまくいくようです。

public class HomeActivity extends Activity
{
...

    @Override
    public boolean dispatchKeyEvent(KeyEvent event) 
    {
        int action = event.getAction();
        int keyCode = event.getKeyCode();
        switch (keyCode) 
        {
            case KeyEvent.KEYCODE_BACK:
                if (action == KeyEvent.ACTION_DOWN)
                {
                    Log.v("myApp", "Back button pressed.");
                    return true;
                }
            default:
                return false;
        }
        return false;
    }
}
于 2012-06-27T01:08:54.523 に答える
0

これを行う最も簡単な方法は、OnBackPressedをオーバーライドし、誰かが戻るボタンを押したときに発生させたいコードを入力することです。

super.OnBackPressed行を必ず削除してください。

于 2012-06-26T23:56:39.073 に答える
0

return trueアンダーを取り外してにbuilder.create().show();変更し、return false動作return trueするかどうかを確認してください。これにより、KeyEvent が初期化されたときに、それらすべてが結果を返せるようになります。

于 2012-06-26T22:40:53.067 に答える