1

I want to implement custom onBackPressed methods for all my fragments which are included in my Main activity. But I am not getting a hook when my device back is pressed. I tried to implement few stuffs available in SOF, but none of them work properly. Please Help!

I tried this in 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;
}
} );
pagalpanda
  • 150
  • 2
  • 16

4 Answers4

2

Use below code hopefully this code will help you.

 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;
        }
    }); 
Amey Bawiskar
  • 361
  • 1
  • 3
  • 17
0

Same issue here. I solve this by setting actionbar title to fragment and then check onBackPressed which fragment is currently visible by checking the title of ActionBar. Its not proper solution but it works for me perfectly. if u have any question tell me. Hope it works for u. Thanx

akhil batlawala
  • 1,066
  • 1
  • 10
  • 30
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;
}
aschattney
  • 329
  • 4
  • 6
0

You can use the new API.

activity?.onBackPressedDispatcher?.addCallback