Вернуться из фрагмента в действие

Во время тестов я заметил, что у Fragment нет onBackPressed, то же самое в Activity.

Моя проблема заключается в следующем: у меня есть действие, и оно принимает фрагмент, в этом фрагменте у меня есть кнопка возврата на панели инструментов (которая работает правильно и возвращается без каких-либо ошибок) и имеет кнопку возврата устройств.

В основном поток выглядит так: MainActivity - MessagesActivity - ConversationsFragment - Conversa Activity.

Мне нужно управлять между экранами ConversationsFragment и MessagesActivity.

Как я мог сделать это управление, как я делаю в onBackPressed, кнопку возврата устройств?

Почему вы не можете справиться с этим в onBackPressed () Activity, содержащего фрагмент?

Gavin Wright 31.10.2018 14:13

Не имеет onBackPressed во фрагменте

Luis Felipe 31.10.2018 14:20

Я знаю. Но ваш фрагмент содержится в действии.

Gavin Wright 31.10.2018 14:21

Ооо да, позволь мне проверить

Luis Felipe 31.10.2018 14:22
0
4
735
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

В котлине можно использовать следующий код:

    view.isFocusableInTouchMode = true
    view.requestFocus()
    // TODO DETECT BACK PRESSED IN FRAGMENT
    view.setOnKeyListener(View.OnKeyListener { _, keyCode, event ->
        if (keyCode == KeyEvent.KEYCODE_BACK && event!!.action == KeyEvent.ACTION_UP) {
            //sendResultBack()
            closeActivity()
            return@OnKeyListener true
        }
        false
    })

в java:

view.setFocusableInTouchMode(true);
view.requestFocus();
view.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            Log.i(tag, "keyCode: " + keyCode);
            if( keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
                Log.i(tag, "onKey Back listener is working!!!");
                getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
                return true;
            } 
            return false;
        }
    });

При загрузке фрагмента добавьте логическое значение loaded = true;

потом

@Override
public void onBackPressed() {
  if (loaded) {
    // remove the fragment
    loaded = false;
  }
  else {
    // start the previous activity
  }
}
Ответ принят как подходящий

Обычно для этого я использую интерфейс базового класса. Так что создайте

BaseFragment

что каждый фрагмент, который в этом нуждается, расширяется. Внутри BaseFragment добавьте:

    /////////////////////////////////////////////////////////////////
// CHILD METHODS
/////////////////////////////////////////////////////////////////
/**
 * To handle backpress down in fragments
 * Called from Parent Activity through BaseFragment Reference and regular onBackPressed

 * @return true if handled down here to avoid letting parent handle it
 */
open fun onBackPressed(): Boolean {
    //override if you care about it in fragment
    return false
}

Теперь в вашем фрагменте просто переопределите onBackPress и верните true, если вы его обработаете, иначе super.onBackpressed () вернет вам false.

Пример ГлавнаяФрагмент

 override fun onBackPressed(): Boolean{
        //if connect dialog is open and didn't handle the on back pressed then call parent onbackpressed
        if(mConnectDialog == null){
            return mConnectDialog!!.onBackPressed()
        }else{
            return super.onBackPressed()
        }
    }

В этом примере может быть открыто диалоговое окно, которое я хочу закрыть при обратном нажатии, прежде чем действие закроется.

Затем в Activity вы должны обработать это следующим образом:

override fun onBackPressed() {
    if(mSelectedFragment != null){
        if(!mSelectedFragment!!.onBackPressed()){
            super.onBackPressed()
        }
    }else{
        super.onBackPressed()
    }
}

Итак, как вы можете видеть, Activity onBackPress проверяет, есть ли фрагмент, который должен сначала обработать его. Если фрагмент возвращает False (не обрабатывается), он переходит к следующему вызывающему. В данном случае это супер, но вы можете настроить его под свои нужды.

Это делается в Kotlin, но вы также можете вставить и преобразовать в Java, если вам это нужно.

Другие вопросы по теме