Android View.OnKeyListener曾为我的活动工作过一次,现在不再工作

Android View.OnKeyListener曾为我的活动工作过一次,现在不再工作,android,Android,我有一个活动,它实现了View.OnKeyListener,这样当用户点击后退按钮时,它就可以捕捉并弹出一个对话框。以前,它工作得很好。然而,最近它停止了工作,应用程序会假装没有onKey方法来捕捉后退按钮。我似乎不明白为什么,因为自从我做了更改后,我几乎没有接触过onKey方法。我试着改用OnBackPressed(),但这并没有解决任何问题,事实上产生了奇怪和不可预测的行为。有人能帮我弄清楚为什么我的应用程序似乎让系统在后退按钮上占据主导地位吗 以下是我实施的重要部分: import com

我有一个活动,它实现了
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;
    }
}

尝试删除
builder.create().show()下的
return true
并将
return false
更改为
return true
,然后查看它是否有效。这将允许它们在初始化KeyEvent时返回结果。

尝试删除
builder.create().show()下的
return true
并将
return false
更改为
return true
,然后查看它是否有效。这应该可以让他们在KeyEvent初始化时都返回结果。

最简单的方法是重写OnBackPressed,并填写您希望在有人按下back按钮时发生的代码


只需确保删除super.OnBackPressed行。

最简单的方法是覆盖OnBackPressed,并填写您希望在有人按下后退按钮时发生的代码


只需确保删除super.OnBackPressed行。

捕获后退按钮的另一种方法是在活动中使用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;
    }
}

捕捉后退按钮的另一种方法是在活动中使用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;
    }
}

…难道这不会拦截每一次按键,让他们什么也不做吗?我的意思是,我知道我这样做只是为了测试的目的,但这听起来仍然很愚蠢,很危险。如果你已经处理了KeyEvent,并且操作系统不需要这样做,那么让KeyEvent返回结果不会返回true吗?建议你为
onKey()
返回true。目前,代码设置为仅在按下后退按钮时返回true(至少应该如此),否则返回false。将其更改为始终返回true将意味着操作系统永远不会处理该活动上的任何按键事件……这难道不会拦截每一次按键并使它们无所作为吗?我的意思是,我知道我这样做只是为了测试的目的,但这听起来仍然很愚蠢,很危险。如果你已经处理了KeyEvent,并且操作系统不需要这样做,那么让KeyEvent返回结果不会返回true吗?建议你为
onKey()
返回true。目前,代码设置为仅在按下后退按钮时返回true(至少应该如此),否则返回false。将其更改为始终返回true将意味着操作系统永远不会处理该活动上的任何按键事件。“我尝试使用
OnBackPressed()
,但这并没有解决任何问题,事实上造成了奇怪和不可预测的行为。”-引用我的问题。“我尝试使用
OnBackPressed()
相反,但这并没有解决任何问题,事实上造成了奇怪和不可预测的行为。”-引用我的问题。小问题:
返回的
不应该与
case
语句一起出现吗?与您应该如何配置选项ItemSelected()类似?是的,它肯定应该是。我想这是一个更干净的解决方案。这样我就返回false,除非关键事件真的做了什么…好吧,这是有效的。这也表明我还有其他的bug要找。对不起,您可能希望执行
returnsuper.dispatchKeyEvent(事件)而不是“returnfalse”小问题:
返回值
不应该与
案例
语句一起出现吗?与您应该如何配置选项ItemSelected()
类似?是的,它肯定应该是。我想这是一个更干净的解决方案。这样我就返回false,除非关键事件真的做了什么…好吧,这是有效的。这也表明我还有其他的bug要找。对不起,您可能希望执行
returnsuper.dispatchKeyEvent(事件)而不是“returnfalse”