这里是我如何做到这一点,
- 创造条件,在实现它的任何类 收到
onBackPressed()
,如果它处理的方法或否则为false将返回true的接口。这将确保您的应用程序在您返回false时退出。
- 在
Activity
创建这些接口的堆栈,然后添加任何此类接口的它。
- 覆盖
onBackPressed()
在您的活动,然后任何时间,它被称为,从堆栈一个监听器和调用自己的onBackPressed()
如果它返回true。如果它返回false,那么它不会处理onBackPressed()
,因此Activity可以接管并删除片段或退出应用程序。
这里是一个样本实现。
您的活动
public class MyActivity extends Activity {
//a stack of OnBackPressedListeners, stack one when you want it to receive onBackPressed() from
//this activity.
//PS used stack so that by LIFO, the last listener would be the first to be called.
private Stack<OnBackPressedListener> onBackPressedListeners = new Stack<>();
@Override
public void onBackPressed() {
if (!onBackPressedListeners.isEmpty()) {
if (onBackPressedListeners.peek().onBackPressed()) //if interface is handling onBackPressed(), return. Otherwise super would be called below.
return;
}
//if no listeners, then do super. This would ensure natural behaviour such as closing the app or popping a fragment when no listeners are using onBackPressed()
super.onBackPressed();
}
//listener interface
public static interface OnBackPressedListener {
/**
* @return true if you're handling onBackPressed, false otherwise to let super.onBackPressed() take over
*/
public boolean onBackPressed();
}
public void addOnBackPressedListener(OnBackPressedListener listener) {
onBackPressedListeners.add(listener);
}
public void removeOnBackPressedListener(OnBackPressedListener listener) {
onBackPressedListeners.remove(listener);
}
}
在您的片段
//implement OnBackPressedListener in your fragment.
public class MyFragment extends Fragment implements OnBackPressedListener {
//find somewhere to add the listener to your Activity, most likely in onCreateView(...)
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
...
((MyActivity)getActivity()).addOnBackPressedListener(this);
...
return view;
}
//overide onBackPressed(), then return true if you're handling the onBackPressed(), false otherwise.
@Override
public boolean onBackPressed() {
if (slider_call_phones.isOpened()) {
slider_call_phones.closeLayer(true);
return true;
}
return false;
}
//lastly remember to remove the listener when your fragment is destroyed, so that it stops receiving callbacks,
//if you don't do this, you might get a NullPointerException.
@Override
public void onDestroy() {
super.onDestroy();
((MyActivity)getActivity()).removeOnBackPressedListener(this);
}
}
我大多使用单Activity
和一大堆的在我的Android应用Fragment
的,这正是我如何解决您遇到的问题,例如,如果在按下后退按钮时打开抽屉中的抽屉,或者在退出应用程序时退出应用程序关闭。
此代码未实现'onBackPressed()'。如果你摆脱了这个代码,而是实现'onBackPressed()',你可能会有更好的运气。 – CommonsWare
【如何实现片段onBackPressed()?] @CommonsWare你的意思是(http://stackoverflow.com/questions/5448653/how-to-implement-onbackpressed-in-fragments) –
'onBackPressed'可能的工作重复罚款碎片? –