我使用操作栏比按下操作溢出时显示了我已定义的菜单选项,当按下硬件后退按钮时,选项按预期关闭。
但我希望为用户提供触发另一种行为的可能性,因此我必须覆盖它在显示项目时对按下硬件后退按钮的反应。
到目前为止,我已尝试过以下方法:
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,但这看起来很长,我想必须有一些更简单的解决方案。
关于如何解决这个问题的任何想法?
答案 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次但很好,它可以工作。