【问题标题】:How to disable back button pressed in android fragment class如何禁用在android片段类中按下的后退按钮
【发布时间】:2013-07-18 07:38:54
【问题描述】:

我想禁用片段类中的后退按钮。 onBackPressed() 在这个片段中似乎不起作用。如何禁用后退按钮?

这是我的示例代码:

public class Login extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
       ,Bundle savedInstanceState) {
        ViewGroup root = (ViewGroup) inflater.inflate(R.layout.login, null);
        return root;
    }

    public void onBackPressed() {
    }
}

【问题讨论】:

  • 用于片段 popbackstack() 方法..

标签: java android eclipse


【解决方案1】:

您必须覆盖父 FragmentActivity 类的 onBackPressed。因此,将您的代码放在父 FragmentActivity 中。或者您可以使用以下方法调用父母的方法:

public void callParentMethod(){
    getActivity().onBackPressed();
}

在 FragmentActivity 中重写 onBackPressed 方法并且不调用它的超类来禁用返回按钮。

@Override
public void onBackPressed() {
  //super.onBackPressed();
  //create a dialog to ask yes no question whether or not the user wants to exit
  ...
}

【讨论】:

    【解决方案2】:

    这是您可以通过新的活动回调在片段中管理onBackPressed() 的新方法:

        // Disable onBack click
        requireActivity().onBackPressedDispatcher.addCallback(this) {
          // With blank your fragment BackPressed will be disabled.
        }
    

    这里是安卓文档链接:https://developer.android.com/reference/androidx/activity/OnBackPressedDispatcher

    【讨论】:

      【解决方案3】:

      在您的 oncreateView() 方法中,您需要编写此代码,并且在 KEYCODE_BACk 中返回应为 true,然后它将停止特定片段的后退按钮选项

           View v = inflater.inflate(R.layout.xyz, container, false);
          //Back pressed Logic for fragment  
          v.setFocusableInTouchMode(true);  
          v.requestFocus();  
          v.setOnKeyListener(new View.OnKeyListener() {  
          @Override  
          public boolean onKey(View v, int keyCode, KeyEvent event) {
              if (event.getAction() == KeyEvent.ACTION_DOWN) {
                  if (keyCode == KeyEvent.KEYCODE_BACK) {
      
                      return true;  
                  }  
              }  
              return false;  
          }  
      });
      

      【讨论】:

      • 只有在使用View v = inflater.inflate(R.layout.fragment, null);时才对我有用
      【解决方案4】:

      在您的父活动中

      @Override
      public void onBackPressed() {
      
          Fragment f = getSupportFragmentManager().findFragmentById(R.id.content_frame);
          if (f instanceof yourfragment) {//the fragment on which you want to handle your back press
              Log.i("BACK PRESSED", "BACK PRESSED");
          }else{
              super.onBackPressed();
          }
      }
      

      【讨论】:

      • 我想知道如何使用 findFragmentById,现在我也知道了。很棒
      【解决方案5】:

      OnBackPressedCallback

      这是您可以在 Fragment 类中编写以自定义后退按钮按下的代码。

      public class MyFragment extends Fragment{
      
          @Override
          public void onCreate(Bundle savedInstanceState){
      
              super.onCreate(savedInstanceState);
      
              OnBackPressedCallback callback = new OnBackPressedCallback(true /* enabled by default */) {
                  @Override
                  public void handleOnBackPressed() {
                      // Handle the back button even
                      Log.d("BACKBUTTON", "Back button clicks");
                  }
              };
      
              requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);
      
           }
      
      }
      

      相关链接

      你可以阅读和研究更多关于这个HERE

      【讨论】:

        【解决方案6】:

        我知道为时已晚, 在片段 onCreate

        val callback = requireActivity().onBackPressedDispatcher.addCallback(this) {
        Log.d("tag","back button pressed")    // Handle the back button event
        }
        
        callback.isEnabled
        

        【讨论】:

        【解决方案7】:
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event)  {
        if ( keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
        
            onBackPressed();
        }
        
        return super.onKeyDown(keyCode, event);
        }
        @Override
        public void onBackPressed() {
        
        return;
        }
        

        【讨论】:

          【解决方案8】:

          改变

          public void onBackPressed() {
          }
          

          @Override
          public void onBackPressed() {
              super.onBackPressed()
          }
          

          @Override
          public boolean onKeyDown(int keyCode, KeyEvent event) {
              if (keyCode == KeyEvent.KEYCODE_BACK) {
          
              }
              return super.onKeyDown(keyCode, event);    
          }
          

          【讨论】:

            【解决方案9】:

            如果您希望片段在没有任何按钮操作的情况下永远不会关闭,您可以尝试阻止取消片段。

            在你的片段方法中添加这个

             this.setCancelable(false);
            

            【讨论】:

              【解决方案10】:

              只需在您要禁用后按的片段中覆盖onBackPressed

              更多信息在这里:https://developer.android.com/reference/androidx/activity/OnBackPressedDispatcher

              public class Login extends Fragment {
                  @Override
                  public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
                      super.onViewCreated(view, savedInstanceState);
                      OnBackPressedCallback callback = new OnBackPressedCallback(true) {
                          @Override
                          public void handleOnBackPressed() {
                              // Log.d("TAG", "Pressed...");
                          }
                      };
                      requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);
                  }
              }
              

              【讨论】:

                【解决方案11】:

                只需放置一个透明视图并为其设置 onClickListener

                【讨论】:

                • 请为提问者提供更详细的信息。代码 sn-p 可能很好。
                • 只需创建一个 match_parent 视图并设置背景透明。为这个视图设置 onClickListener 并且在里面什么也不做
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-08-09
                • 1970-01-01
                • 2013-08-11
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多