如何禁用在android片段类中按下的后退按钮

Posted

技术标签:

【中文标题】如何禁用在android片段类中按下的后退按钮【英文标题】:How to disable back button pressed in android fragment class 【发布时间】: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() 方法.. 【参考方案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

【讨论】:

是的!这应该工作:developer.android.com/guide/navigation/navigation-custom-back【参考方案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 并且在里面什么也不做

以上是关于如何禁用在android片段类中按下的后退按钮的主要内容,如果未能解决你的问题,请参考以下文章

如果在 WebView 片段中按下后退按钮,如何返回上一页?

在android中按下后退按钮后如何返回相同的选项卡?

检测到在 react-router 中按下了后退按钮

如何确定后退按钮按下

在 Android 片段中使用 onBackPressed()

如果在 Fragment 的 WebView 中按下后退按钮,如何返回上一页?