Как закончить фрагмент в потоке Master/Detail?

Я не знаю, как это сделать правильно. У меня есть основной/подробный поток, теперь я выполняю действие в детали, которое должно завершить его, но, конечно, фрагмент детали не должен знать, обернут ли он одной или двойной панелью.

Итак, как мне это сделать? Я думал об обратном вызове, который будут реализовывать оба действия, и одна панель просто завершит себя и, следовательно, завершит фрагмент, а двойная панель просто вытолкнет фрагмент.

Это хорошая идея? Имеются обратные вызовы из фрагмента детали? Разве это не большие накладные расходы?

Спасибо


person urSus    schedule 21.02.2013    source источник
comment
Разве это не большие накладные расходы? -› Не верю. Если вы абстрагируете этот обратный вызов, его можно повторно использовать для других фрагментов. Я также считаю, что это действительное предложение для решения вашей проблемы. Фрагменты привнесли гибкость для разработчика (больше, чем действия), но у вас будет больше кода, чем с действиями, для обработки всех вариантов использования.   -  person Tobrun    schedule 21.02.2013
comment
Нет, это не накладные расходы. Это верный путь. Если вы не хотите реализовывать этот интерфейс, просто сделайте это if getActivity() instanseOf SinglePaneActivity, затем getActivity().finish(); еще getActivity().getFragmentManager().popMyFragment();.   -  person M-WaJeEh    schedule 21.02.2013


Ответы (2)


теперь я выполняю действие в деталях, которые должны его закончить

Это необычный поток для шаблона master/detail. Обычно детали сохраняются до тех пор, пока пользователь не коснется чего-то еще в основном списке. Однако я мог видеть предложенный вами поток для операции удаления просматриваемого элемента.

Я думал об обратном вызове, который будут реализовывать оба действия, и одна панель просто завершит себя и, следовательно, завершит фрагмент, а двойная панель просто вытолкнет фрагмент.

Это прекрасный ответ.

Разве это не большие накладные расходы?

Нет. Определите интерфейс, который должны реализовать все действия, содержащие ваш фрагмент. Вы можете рассмотреть возможность использования шаблона контракта, чтобы обеспечить соблюдение этого:

import android.app.Activity;
import com.actionbarsherlock.app.SherlockFragment;

// from https://gist.github.com/2621173

public abstract class ContractFragment<T> extends SherlockFragment {
  private T mContract;

  @SuppressWarnings("unchecked")
  @Override
  public void onAttach(Activity activity) {
    try {
      mContract=(T)activity;
    }
    catch (ClassCastException e) {
      throw new IllegalStateException(activity.getClass()
                                              .getSimpleName()
          + " does not implement "
          + getClass().getSimpleName()
          + "'s contract interface.", e);
    }
    super.onAttach(activity);
  }

  @Override
  public void onDetach() {
    super.onDetach();
    mContract=null;
  }

  public final T getContract() {
    return mContract;
  }
}

(код основан на сумме Джейка Уортона из знаменитого ActionBarSherlock)

Здесь T — это имя интерфейса. Ваш фрагмент наследуется от этого и вызывает getContract() для получения объекта реализации интерфейса, для которого вы вызываете свой метод обратного вызова. Накладные расходы во время выполнения составят не более нескольких десятков инструкций — вам не о чем беспокоиться.

person CommonsWare    schedule 21.02.2013
comment
Я думал о том, чтобы иметь мастер / деталь с действием «Добавить / изменить» в списке, который поместил бы фрагмент формы туда, где был фрагмент детали, поэтому, когда вы отправляете форму, она убьет себя и вернется к нормальному фрагмент детали (табличка). Удаление из фрагмента детали также имеет место. Я просто не знал, делать ли это с помощью обратных вызовов, чтобы действия оболочки контролировали фрагмент, или просто оператор if внутри фрагмента, чтобы выяснить, кто меня размещает, как предложил M-WaJeEh. - person urSus; 21.02.2013
comment
@VlastoBennyLava: А, хорошо, твой план имеет смысл. Лично я предпочитаю, чтобы мои фрагменты не знали об активности хостинга, а подход instanceof требует, чтобы фрагменты знали об определенных классах активности. Следовательно, я предпочитаю интерфейсный подход, описанный в моем ответе. Однако оба будут работать. - person CommonsWare; 21.02.2013
comment
В другой теме, не могли бы вы взглянуть на мой другой вопрос? stackoverflow.com/questions/14990269/. Спасибо. - person urSus; 21.02.2013

Нет, это не накладные расходы. Это верный путь.

или сделайте это в своем DetailFragment:

if (getActivity() instanseOf SinglePaneActivity){
    getActivity().finish(); 
}else{ 
    getActivity().getFragmentManager().popBackStack();
}
person M-WaJeEh    schedule 21.02.2013