0

Я изучал это несколько дней и еще не нашел рабочего решения. Существует много информации, но из-за моей неопытности с Android я не могу получить какие-либо предложения для работы.Как активировать активность, чтобы фрагмент нажал кнопку «Назад»

У меня есть работа со стеком из 3 фрагментов, поверх которых все они представлены с использованием транзакций FragmentManager и добавлены в стопку. Пока третий фрагмент активен, мне нужно перехватить метод onBackPressed() и выполнить некоторые дополнительные действия до того, как фрагмент будет уничтожен.

Я попытался использовать обратные вызовы и интерфейсы для захвата onBackPressed() в Activity и отправить его на 3-й фрагмент без везения.

Каков правильный способ обнаружения фрагмента в стеке для метода OnBackPressed().

Сообщите мне, если это неясно.

Спасибо за помощь.

+0

Is onBackPressed() необходимо? Или вы просто пытаетесь что-то сделать, поскольку фрагмент уничтожен? –

+0

Может быть, лучше переопределить 'onPause'? –

+0

Последние 2 фрагмента в стеке необходимо выталкивать одновременно или сразу после друг друга, и я делаю это просто отлично с помощью встроенной кнопки отмены, вызывая popBackStack() 2 раза (возможно, не лучший способ сделайте это ...), поэтому мне нужно сделать то же самое onBackPressed(), иначе только 1 фрагмент будет уничтожен. – Sevren

ответ

0

Это сообщение, которое ответило на мой вопрос. Для новичка Android это рассказывало мне, куда все нужно идти.

https://stackoverflow.com/a/30865486/2640458

Фрагмент, который необходим, чтобы увидеть метод onBackPress() от его деятельности:

public class RatingFragment extends Fragment implements ContentActivity.OnBackPressedListener { 

@Override 
public void doBack() { 
    getFragmentManager().popBackStack(); 
} 

Очень важно подписка на слушателя в приведенном выше фрагменте:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_rating, container, false); 

    ((ContentActivity)getActivity()).setOnBackPressedListener(this); 
} 

Упражнение, которое необходимо отправить методу onBackPress() в приведенный выше фрагмент:

public class ContentActivity extends Activity { 

protected OnBackPressedListener onBackPressedListener; 

public interface OnBackPressedListener { 
    void doBack(); 
} 

public void setOnBackPressedListener(OnBackPressedListener onBackPressedListener) { 
    this.onBackPressedListener = onBackPressedListener; 
} 

@Override 
public void onBackPressed() { 
    if (onBackPressedListener != null) 
     onBackPressedListener.doBack(); 
    else 
     super.onBackPressed(); 
} 

@Override 
protected void onDestroy() { 
    onBackPressedListener = null; 
    super.onDestroy(); 
} 
} 
+0

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

+0

Да, я поддержал тот, который помог. – Sevren

0

Не компилируется и тестируется, но это излагает основной подход:

public interface BackButonListener { 
    boolean OnBackButtonPressed(); 
} 

public interface BackButtonWatchable { 
    void addBackButtonListener(BackButtonListener listener); 
    void removeBackButtonListener(BackButtonListener listener); 
} 

public class MyActivity extends Activity implements BackButtonWatchable { 
... 
    private static ArrayList<BackButtonListener> backButtonListeners 
     = new ArrayList<BackButtonListener>(); 
    @Override 
    public void addBackButtonListener(BackButtonListener listener) { 
      backButtonListeners.add(listener); 
    } 
    @Override 
    public void removeBackButtonListener(BackButtonListener listener) { 
      backButtonListeners.remove(listener); 
    } 
... 
    @Override 
    public void onBackButtonPressed() 
    { 
     boolean supressBackButton = false; 
     for (BackButtonListener listener: backButtonListeners) 
     { 
      if (!listener.OnBackButtonPressed()) { 
        suppressBackButton = true; 
      } 
     } 
     if (!suppressBackButton) { 
      super.onBackButtonPressed(); 
     } 
    } 
} 


public class MyFragment extends Fragment implements BackButtonListerer { 
    @Override 
    public void onResume() 
    { 
      ((BackButtonWatchable)getActivity()).addBackButtonListener(this); 
    } 
    @Override 
    public void onPause()  { 
      ((BackButtonWatchable)getActivity()).removeBackButtonListener(this); 
    } 
} 
+0

Чтобы быть ясным, мы имеем дело с Activity и Fragment, оба являются интерфейсами в Activity или являются одним из Activity и one in Fragment? – Sevren

+0

Я предлагал объявить интерфейсы на верхнем уровне. Они не принадлежат к этой деятельности. Если вы хотите использовать фрагмент только в одном действии, вы можете просто указать значение Fragment.getActivity() в свой класс верхнего уровня и вообще не использовать интерфейс. –

+0

... Возможно, правильным шаблоном является объявление интерфейсов в фрагменте. В этом случае BackButtonWatchable должен быть переименован в MyFragment.MyFragmentListener. (отличный образец для фрагментов), а затем любая активность, содержащая фрагмент, должна реализовать MyFragment.MyFragmentListener. Заботясь просто отличить MyFragment.getActivity() к вашему классу верхнего уровня, но если вы когда-либо захотели повторить фрагмент в другом действии, все становится трудным. Интерфейс MyFragmentListener полезен тем, что он заставляет вас поддерживать связь между фрагментом и операцией скудным и средним. –

0

интерфейс Крит

public interface OnBackPressedListener { 
    void onBackPressed(); 
} 

и создать поле деятельности

private OnBackPressedListener mListener; 

и ваш onBackPressed() должен выглядеть как

if (mListener != null) { 
    mListener.onBackPressed(); 
} else { /* do your acitivty usual stuff */ } 

Когда фрагмент создан, вы регистрируете этот фрагмент в качестве mListener в своей деятельности и не подделываете его, чтобы установить его значение null в onDestroy.

Смежные вопросы