简体   繁体   English

如何为 Android Fragment 实现 onBackPressed?

[英]How to implement onBackPressed for Android Fragment?

I want to implement custom onBackPressed methods for all my fragments which are included in my Main activity.我想为我的主要活动中包含的所有片段实现自定义 onBackPressed 方法。 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.我试图在 SOF 中实现一些可用的东西,但它们都没有正常工作。 Please Help!请帮忙!

I tried this in onCreateView:我在 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;
}
} );

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

您可以使用新的 API。

activity?.onBackPressedDispatcher?.addCallback

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.我通过将操作栏标题设置为片段来解决这个问题,然后通过检查操作栏的标题来检查当前可见的片段 onBackPressed。 Its not proper solution but it works for me perfectly.它不是正确的解决方案,但它对我来说完美无缺。 if u have any question tell me.如果你有任何问题,请告诉我。 Hope it works for u.希望它对你有用。 Thanx谢谢

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM