2017-05-30 11 views
1

アクションバーを使用しているときよりもアクションバーを使用しているときは、ハードウェアの戻るボタンを押してオプションを閉じると、定義したメニューのオプションが表示されます。アクションバーのハードウェア戻るボタンの動作を無効にする

しかし、私は、押した場合に別の動作をトリガーする可能性を提供したいので、アイテムが表示されているときにハードウェアの戻るボタンを押すのに反応する方法を変更する必要があります。

は、これまでのところ、私は次のことを試してみた:

 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

void onBackPressed()。アクティビティがユーザの背中キーの押下を検出したときに呼び出されます。あなたはそれを試しましたか? – ElDuderino

+0

問題は、BackPressedは、毎回同じように動作する必要はありませんが、とにかくそれを解決しなければなりません。 – user2638180

答えて

0

私は最終的にこのようなコードでそれを解決するようになった:アクションバーからメニューはイベントが起動され、表示された場合、私は実際には4を起動、ボタンをハードウェアをバック押すたび

@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; 
     } 
    } 

timesclosedとexitinmenuで、私はメニューが閉じた場所を制御することができます。なぜ4回発射されたのだろうと思うが、うまくいく。

関連する問題