1

Main アクティビティに含まれるすべてのフラグメントにカスタム onBackPressed メソッドを実装したいと考えています。しかし、デバイスを後ろに押してもフックがかかりません。SOF で利用可能なものをいくつか実装しようとしましたが、どれも適切に動作しません。助けてください!

onCreateViewでこれを試しました:

rootView.setFocusableInTouchMode(true);
rootView.requestFocus();
rootView.setOnKeyListener( new OnKeyListener()
{
@Override
public boolean onKey( View v, int keyCode, KeyEvent event )
{
    if( keyCode == KeyEvent.KEYCODE_BACK)
    {
        return true;
    }
    return false;
}
} );
4

4 に答える 4

2

以下のコードを使用してください。うまくいけば、このコードが役に立ちます。

 rootView.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {


            if (keyCode == KeyEvent.KEYCODE_BACK) {


                backFlag = backFlag++;

                if (backFlag == 2) {
                    getActivity().finish();
                }
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                backFlag = 0;

                return true;
            }
            return false;
        }
    }); 
于 2015-09-19T15:03:49.820 に答える
0
public interface OnBackPressedListener {
  boolean onBackPressed();
}

public interface OnBackPressedNotifier {
  void registerOnBackPressedListener(OnBackPressedListener listener);
  void unregisterOnBackPressedListener(OnBackPressedListener listener);
}




public class SampleActivity extends Activity implements OnBackPressedNotifier {

  List<OnBackPressedListener> onBackPressedListeners = new ArrayList<>();

  @Override
  public void registerOnBackPressedListener(OnBackPressedListener listener)   {
    if (!onBackPressedListeners.contains(listener))
        onBackPressedListeners.add(listener);
  }

  @Override
  public void unregisterOnBackPressedListener(OnBackPressedListener listener) {
    if(onBackPressedListeners.contains(listener))
        onBackPressedListeners.remove(listener);
    }

  @Override
  protected void onDestroy() {
    onBackPressedListeners.clear();
    super.onDestroy();
  }

  private boolean notifyOnBackPressed(){
      boolean handledByFragment = false;
      for (OnBackPressedListener listener : onBackPressedListeners){
          handledByFragment = listener.onBackPressed();
          if (handledByFragment)
              break;
      }
      return handledByFragment;
  }

  @Override
  public void onBackPressed() {
      if (!notifyOnBackPressed())
          super.onBackPressed();
  }

}

public class SampleFragment extends android.support.v4.app.Fragment implements OnBackPressedListener {

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    ((OnBackPressedNotifier)getActivity()).registerOnBackPressedListener(this);
}

@Override
public void onDetach() {
    ((OnBackPressedNotifier)getActivity()).unregisterOnBackPressedListener(this);
    super.onDetach();
}

@Override
public boolean onBackPressed() {
    // Handle onBackPressed
    return false;
}
于 2015-09-19T14:47:01.797 に答える
0

ここで同じ問題。アクションバーのタイトルをフラグメントに設定することでこれを解決し、ActionBar のタイトルをチェックして現在表示されているフラグメントを onBackPressed でチェックします。適切な解決策ではありませんが、私にとっては完全に機能します。何か質問があれば教えてください。それがうまくいくことを願っています。ありがとう

于 2015-09-19T10:11:42.393 に答える