【问题标题】:Disable Back Button press from fragment禁用片段中的后退按钮按下
【发布时间】:2014-08-14 08:52:57
【问题描述】:

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

在主要活动中:

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

在片段中,

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

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

【问题讨论】:

标签: android android-fragments


【解决方案1】:

您应该保留对要在主要活动上禁用/处理后按事件的片段的引用:

class MainActivity{

    OrderFragment mOrderFragment;

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

}

在OrderFragment中:

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

【讨论】:

  • 我收到java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.support.v4.app.Fragment.isVisible()' on a null object reference 错误。
  • 您的片段引用似乎为空。您应该尝试在调用 isVisible() 之前添加一个检查空条件
【解决方案2】:

在您的 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;   
}    
});

【讨论】:

    【解决方案3】:
    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;
            }
        }
    });
    

    【讨论】:

    • 当有像 EditText 这样的可聚焦视图时,这可能不起作用。也许我们可能还需要在上面添加关键侦听器..
    • @technoguff 你是对的,当软键盘被激活时这不起作用,但有什么解决方案来克服这个问题?你也可以把代码也放上去吗
    【解决方案4】:

    我认为您必须在需要禁用后按的片段中覆盖 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】:

      你有没有这样尝试过,其实它以前对我有用。

      您可以为返回键设置监听器。如果你添加它,我想它会起作用。

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

      【讨论】:

        【解决方案6】:

        super.onBackPressed在activity中是默认实现。如果您不想要它,请删除它。

        【讨论】:

          【解决方案7】:
          @Override
          public void onBackPressed() {
              Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
              if (currentFragment instanceof YourFragment) {
                   currentFragment.onBackPressed();
              } else
                  super.onBackPressed();
          }
          

          【讨论】:

            【解决方案8】:
            override fun onBackPressed() {
                val currentFragment = findNavController(R.id.nav_host_fragment).currentDestination?.id
                if (currentFragment == R.id.YourFragment) {
                    return
                }
                super.onBackPressed()
            

            【讨论】:

              【解决方案9】:

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

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

              语言:科特林

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

              这将禁用您对该特定片段的后按

              【讨论】:

                【解决方案10】:

                如果您不希望您的片段位于后台堆栈中,您可以这样做,方法是不将其添加到事务中的后台堆栈中。因此,NOT 调用 FragmentTransaction.addToBackStack(); 对您不希望在您的后台堆栈中的片段。

                【讨论】:

                  【解决方案11】:

                  onBackPressed 是这样工作的:

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

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

                  fragmentTransaction.addToBackStack(TAG);
                  

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

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

                  【讨论】:

                    【解决方案12】:

                    试试这个

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

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2013-07-18
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多