覆盖操作栏上硬件后退按钮的行为

时间:2017-05-30 23:34:28

标签: android

我使用操作栏比按下操作溢出时显示了我已定义的菜单选项,当按下硬件后退按钮时,选项按预期关闭。

但我希望为用户提供触发另一种行为的可能性,因此我必须覆盖它在显示项目时对按下硬件后退按钮的反应。

到目前为止,我已尝试过以下方法:

       myToolbar.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View view, int i, KeyEvent keyEvent) {

            if (i == KeyEvent.KEYCODE_BACK) {
                finish();
                return false;
            }
            else
            {
                return true;
            }
        }
    });

正如预期的那样,这段代码不起作用,当按下硬件后退按钮时它甚至不会触发。

我还试图通过使用以下类从工具栏扩展来创建我自己的工具栏,以便能够覆盖其onKeyPreIme事件:

public class LockToolbar extends Toolbar
{
private KeyImeChange keyImeChangeListener;

/* Must use this constructor in order for the layout files to instantiate the class properly */
public LockToolbar(Context context)
{
    super(context);
    // TODO Auto-generated constructor stub
}

public void setKeyImeChangeListener(KeyImeChange listener){
    keyImeChangeListener = listener;
}

public interface KeyImeChange {
    public void onKeyIme(int keyCode, KeyEvent event);
}

@Override
public boolean onKeyPreIme (int keyCode, KeyEvent event)
{
    if(keyImeChangeListener != null){
        keyImeChangeListener.onKeyIme(keyCode, event);
    }
    return false;
}

}

这个类本身至少可以正确编译,但问题是比为类工具栏定义的指令setSupportActionBar需要Toolbar对象才能正常工作,它不能支持lockToolbar。

我知道我可以覆盖方法setSupportActionBar,但这看起来很长,我想必须有一些更简单的解决方案。

关于如何解决这个问题的任何想法?

1 个答案:

答案 0 :(得分:0)

我终于用这样的代码解决了它:

 @Override
    public void onPanelClosed(int featureId, Menu menu)
    {

       timesclosed++;

        if (exitinmenu)
        {
            finish();
        }
        else
        {
            if ((exitinmenu2) && (timesclosed==1))
            {
                    finish();
            }
            else
            {
                if ((exitinmenu3) && (timesclosed==5))
                {
                    finish();
                }
            }
        }

        if (timesclosed==8)
        {
            timesclosed=0;
        }
    }

每当我按下硬件后退按钮时,如果操作栏中的菜单显示,则事件被触发,实际上它会触发4次,有时间关闭和退出菜单我可以控制菜单关闭的位置。我想知道它为什么会发射4次但很好,它可以工作。