我的应用程序有一个包含这么多碎片的活动。我想在某些片段中禁用后退按钮。我尝试使用以下代码。但它没有用。
在主要活动中:
@Override
public void onBackPressed() {
super.onBackPressed();
OrderFragment.onBackPress();
}
在片段中,
public static void onBackPressed()
{
Log.d(TAG,"It listen");
}
我有日志消息但是,如何禁用片段中的后退按钮。
答案 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
}
}
这将禁止在特定片段上按回键