禁用从片段按下后退按钮

时间:2014-08-14 08:52:58

标签: android android-fragments

我的应用程序有一个包含这么多碎片的活动。我想在某些片段中禁用后退按钮。我尝试使用以下代码。但它没有用。

在主要活动中:

@Override
public void onBackPressed() {
        super.onBackPressed();
        OrderFragment.onBackPress();
}

在片段中,

public static void onBackPressed()
{
    Log.d(TAG,"It listen");
}

我有日志消息但是,如何禁用片段中的后退按钮。

12 个答案:

答案 0 :(得分:7)

您应该在主要活动中保留对要禁用/处理反压事件的片段的引用:

class MainActivity{

    OrderFragment mOrderFragment;

    @Override
    public void onBackPressed() {
        if(mOrderFragment.isVisible())
            mOrderFragment.onBackPressed();
        else
            super.onBackPressed();
    }

}

在OrderFragment中:

public void onBackPressed() {
    //handle back press event
}

答案 1 :(得分:3)

在你的oncreateView()方法中,你需要编写这段代码,并且在KEYCODE_BACk中返回true,那么它将停止特定片段的后退按钮选项

 'use strict';
 var _app = require('./app.js');
 var _app2 = _interopRequireDefault(_app);
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj :     { default: obj }; }
 console.log(_app2.default);

答案 2 :(得分:2)

你有没有试过这样的话,实际上它之前适合我。

您可以为Back键设置侦听器。如果你添加它,我想它可行。

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

答案 3 :(得分:2)

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

            // leave this blank in order to disable the back press 

            return true;
        } else {
            return false;
        }
    }
});

答案 4 :(得分:2)

我认为您必须在片段中覆盖onResume方法,您需要禁用后退。请尝试以下代码。

@Override
public void onResume() {

    super.onResume();
    this.getView().setFocusableInTouchMode(true);
    this.getView().requestFocus();
    this.getView().setOnKeyListener(new View.OnKeyListener() {

        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {

            if (keyCode == KeyEvent.KEYCODE_BACK) {

                return true;
            }
            return false;
        }
    });
}

答案 5 :(得分:1)

@Override
public void onBackPressed() {
    Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
    if (currentFragment instanceof YourFragment) {
         currentFragment.onBackPressed();
    } else
        super.onBackPressed();
}

答案 6 :(得分:0)

onBackPressed的工作原理如下:

public void More onBackPressed() {
    if (!mFragments.popBackStackImmediate()) {
        finish();
    }
}

因此,当您调用super.onBackPressed()时,您会在完成活动之前弹出BackStack。解决此问题的最佳方法是确保将片段添加到BackStack。通常这样做:

fragmentTransaction.addToBackStack(TAG);

另一种解决方案,但是由于您还有无用的代码,但是更为丑陋的是onBackPressed()直接调用finish()来结束活动。

我强烈建议您不要使用getView().setOnKeyListener(...),因为它有代码味道。

答案 7 :(得分:0)

活动中的

super.onBackPressed是默认实现。如果你不想要它,请删除它。

答案 8 :(得分:0)

如果您不希望您的片段位于Backstack中,则可以通过不将其添加到事务中的Backstack来实现。那么就你背包中不需要的片段调用FragmentTransaction.addToBackStack();

答案 9 :(得分:0)

试试这个

public void onBackPressed() {
if (!mFragments.popBackStackImmediate()) {
finish();
}else{
super.onBackPressed();}

}

答案 10 :(得分:0)

override fun onBackPressed() {
    val currentFragment = findNavController(R.id.nav_host_fragment).currentDestination?.id
    if (currentFragment == R.id.YourFragment) {
        return
    }
    super.onBackPressed()

答案 11 :(得分:0)

我知道这是一个老问题,由于导航组件和新方法,这种情况很少发生,但也许我的回答对某人有所帮助。

我遇到了类似的情况,我需要禁用后退按钮,并且也无法更改活动。因此,在一个片段中,我添加了此代码块。

语言:科特林

override fun onResume() {
    super.onResume()
    this.requireView().isFocusableInTouchMode = true
    this.requireView().requestFocus()
    this.requireView().setOnKeyListener { _, keyCode, _ ->
        keyCode == KeyEvent.KEYCODE_BACK
    }
}

这将禁止在特定片段上按回键