【问题标题】:Onbackpressed in fragment not working while implementing interface实现接口时片段中的 Onbackpressed 不起作用
【发布时间】:2014-11-03 11:42:03
【问题描述】:

我正在尝试覆盖 fragment 内的 onbackpressed 方法。但它给了我语法错误,它应该覆盖接口中的超级方法。为什么这样?我的片段类中还有其他方法,例如 ondestroy,但没有错误。为什么要单独为这个背压。我也试过onkeydown。同样的错误。粘贴在我的代码下方。

  public TestClass extends Fragment implements    Testinterface
{  @Override //error must override or implement    supertype method
 public void onBackPressed ()
{
 if (check)
Do somethin
 else
  getActivity().finish ()
  //super.onBackPressed () // error here if I use this
  }

【问题讨论】:

  • 您必须在片段中实现按键按下,检查按键代码。 onBackPress() 方法可以在 Activity 中使用——它是片段的逻辑父级。

标签: android android-fragments


【解决方案1】:

您必须在片段中实现按键按下,检查按键代码。 onBackPress() 方法可以在 Activity 中使用——它是片段的逻辑父级。

试试这个:

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

【讨论】:

  • 我已经尝试过了。它给了我错误 onKeyDown is undefined 对于 super.onKeyDown 行中的类型片段。 eclipse 给了我建议,要么删除覆盖符号,要么在超类型 TestInterface 中创建 onKeyDown。
  • 在你的这个代码块中: if( keyCode == KeyEvent.KEYCODE_BACK ){ // return true; // 除了返回 true,你甚至可以调用 getActivity.onBackPressed();这将调用您的活动的重写方法 onBackPressed 并按照您的意愿执行操作。 }
【解决方案2】:

您可以将 onBackPressed() 传播到您的所有片段,为此您需要使用以下方法创建两个类,然后使您的所有活动和片段都继承自它们:

public class BaseActivity extends ActionBarActivity {

    @Override
    public void onBackPressed() {
        boolean eventConsumed = false;
        List<Fragment> fragments = getSupportFragmentManager().getFragments();
        if (fragments != null) {
            for (Fragment fragment : fragments) {
                if (fragment instanceof BaseFragment) {
                    eventConsumed = eventConsumed
                            || ((BaseFragment) fragment).onBackPressed();
                }
            }
        }
        if (!eventConsumed) {
            super.onBackPressed();
        }
    }
}

public class BaseFragment extends Fragment {

    public boolean onBackPressed() {
        return false;
    }
}

请注意,此代码正在使用支持库,如果您不使用它,则需要进行适当的更改。

【讨论】:

  • 当我把代码放在 ((BaseFragment) 片段).onBackPressed();它仍然会结束应用程序,但会执行该行之后的代码。
  • @tim687 您必须将处理后按事件的代码放入从 BaseFragment 继承的方法中。提示:如果你想阻止对 Activity 的 onBackPressed 方法的调用,该方法应该返回 true。
  • 谢谢!!我已经删除了 super.onBackPressed();行,但这不是它应该如何工作的
【解决方案3】:

尽量避免在片段中使用 onKey。有个更好的方法。 对于维护,我建议您使用 getBackStackEntryCount()

在活动中

final FragmentMananger fm = new getSupportFragmentManager(); 

@Override
protected void onCreate(Bundle b){
   super.onCreate(b);
   setContentView(R.layout.activity_main);

   Fragment fragment = new SomeFragment();
   // if you don't run on prior to Android 3.0 use getFragmentManager();
   fm.beginTransaction().replace(R.id.frame_container, fragment).addToBackStack(null).commit();
   // R.id.frame_container is the id of FrameLayout in activity_main.xml
}

@Override
public void onBackPressed(){
   if(fm.getBackStackEntryCount() == 0){
       finish();
   }else{
    super.onBackPressed();
   }
}

【讨论】:

    猜你喜欢
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    相关资源
    最近更新 更多