Android在Fragment上实现onBackPress导致禁用从应用程序退出

时间:2016-11-13 14:30:17

标签: android android-fragments

在我的应用程序中我有一些片段,我可以通过点击电话后退出应用程序没有问题,但当我实现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

2 个答案:

答案 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();
}