在实现接口时片段中的Onbackpressed不工作

时间:2014-06-06 05:52:30

标签: android android-fragments

我试图覆盖片段内的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
  }

3 个答案:

答案 0 :(得分:12)

你必须在片段中按下键,检查键码。 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;
    }
} );

答案 1 :(得分:3)

您可以将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;
    }
}

请注意,此代码使用的是支持库,如果您不使用它,则需要进行相应的更改。

答案 2 :(得分:1)

尽量避免在片段中使用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();
   }
}