我试图覆盖片段内的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
}
答案 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();
}
}