在我的应用程序中我有一些片段,我可以通过点击电话后退出应用程序没有问题,但当我实现onBackPress
时,我无法退出应用程序
我的代码:
@Override
public void onResume() {
super.onResume();
if (getView() == null) {
return;
}
getView().setFocusableInTouchMode(true);
getView().requestFocus();
getView().setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
if (slider_call_phones.isOpened()) {
slider_call_phones.closeLayer(true);
}
return true;
}
return false;
}
});
}
我想在片段而非活动
上处理onBackPressed
答案 0 :(得分:0)
这是我的工作方式,
onBackPressed()
的界面
实现它,如果它处理方法将返回true,否则返回false。这样可以确保您的应用在返回false时退出。Activity
中创建这些接口的堆栈,然后将任何此类接口添加到其中。onBackPressed()
,然后在它被调用的任何时候,从堆栈中获取一个监听器,如果它返回true,则调用它自己的onBackPressed()
。如果它返回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);
}
}
我大多在我的Android应用中使用一个Activity
和一大堆Fragment
,这正是我解决您遇到的问题的方法,例如关闭抽屉在片段中,如果在按下后退按钮时打开,或者在应用程序关闭时退出。
答案 1 :(得分:-1)
您应该按以下方式调用onBackPressed()以退出应用程序:
public void onBackPressed(){
finishAffinity();
}