Вопрос по android-fragments, android – API getParentFragment 16

11

Мы все знаемgetParentFragment изFragment вводится в API 17.

Так что, если мы хотим получить родительский фрагмент в API 16 и ниже (учитывая, что я использую нативныйFragment с поддержкойFragmentStatePagerAdapter и не имеют проблем с вложенными фрагментами)

Есть ли лучший способ, чем мой?

В родительском:

public class ParentFragment extends Fragment {

public static ParentFragment StaticThis;
...

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

StaticThis = this;

...
}

У ребенка:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
         parentFragment = (ParentFragment) getParentFragment();
else
         parentFragment = ParentFragment.StaticThis;
@Snicolas: Там нет понятия "родительский фрагмент "За исключением API уровня 17+ или использования фрагмента backport. Если вы находитесь на одном из них, используйте.getParentFragment() CommonsWare
Я использую ViewPager и должен говорить от предметов к контейнеру ViewPager. @ ComomWare так что естьНет безопасного способа вернуться к родительскому фрагменту (вызвать некоторый метод) ниже API 17? Mohsen Afshin
@Snicolas: Вы можетеЯ не принимаю ответ, так как это не ваш вопрос. И мой комментарий не отвечает ОП 'Вопрос (в основном потому, что ответа нет), поэтому я поставил его в качестве комментария. CommonsWare
Поскольку ниже API 17 нет родительского фрагмента, невозможно общаться с родительским фрагментом ниже API 17. CommonsWare

Ваш Ответ

3   ответа
5

На основании вашего комментария, если вы хотите поговорить с "Предметы" в вашемViewPager (Я'Я предполагаю, что этоFragment) к контейнеруViewPager который являетсяFragmentActivity Вы можете использовать интерфейс.

(1) Либо объявите интерфейс вFragment сам или как отдельный файл (2)Инициализировать» интерфейс в вашем фрагментеМетод onAttach. Например

 private SomeInterface blah;

 @Override
 public void onAttach(Activity activity){
    blah = (SomeInterface) activity;
 }

(3) Реализуйте интерфейс в своем.FragmentActivity

Затем вы можете перезвонить наFragmentActivity от твоегоFragment, Оттуда вы можете вызвать любой метод в пределахFragmentActivity или, если вы получите ссылку на любой из других фрагментов, которые загружены в вашViewPagerвызовите любой публичный метод в этомFragment, Это позволяет связываться между фрагментами и их контейнером без утечки памяти.

Сам родитель является Fragment, а не FragmentActivity, так что я могуне использовать onAttach, вместо этого я передаю его в качестве параметра конструктору дочерних фрагментов Mohsen Afshin
Ах, хорошо, вы все равно можете использовать интерфейс. Тот'лучше, чем статическая ссылка. Моя другая идея - использовать внутренний абстрактный класс, к которому вы получаете доступ из родительского класса. Таким образом, вы можете перезвонить фрагменту хоста таким образом. Вроде то же самое понятие, хотя. Rarw
Idk спросить парня, который задал этот вопрос Rarw
Интерфейсы являются огромной частью программирования ОО. Почему так много вопросов по этому поводу? danny117
4

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

1) Установите тег ParentFragment в своей деятельности (через .add () или .replace ()). Проверьте ссылку ниже для получения дополнительной информации или шаг 2 для аналогичного примера в ParentFragment:http://developer.android.com/reference/android/app/FragmentTransaction.html#add(android.app.Fragment, java.lang.String)

2) В ParentFragment соберите тег (используяэтот') и добавьте его в newInstance () вашего ChildFragment:

  FragmentManager fragmentManager = getFragmentManager();
  FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

  // Get the fragment, if you want to re-use it
  ChildFragment fragment = (ChildFragment) fragmentManager.findFragmentByTag();

  // Create a new fragment if it doesn't already exist.
  if (fragment == null)
  {
     // Collect the tag of your ParentFragment and add it to the newInstance() of the ChildFragment
     String parentTag = this.getTag();
     fragment = ChildFragment.newInstance(parentTag);
  }
  // Put the fragment in the .replace() or .add() of the transaction.
  // You might use a childTag as well, but it's not necessary for solving your problem
  fragmentTransaction.replace(R.id.my_fragment_view, fragment, childTag);
  fragmentTransaction.commit();

3) Обязательно сохраните тег в аргументах ChildFragment. Соберите тег из аргументов в onAttach () и соберите ParentFragment через 'деятельность' параметр из onAttach ():

private static final String PARENT_TAG = "parent_tag";
ParentFragment parentFragment;

public static ChildFragment newInstance(String parentTag)
{
   ChildFragment fragment = new ChildFragment();
   Bundle args = new Bundle();
   args.putString(PARENT_TAG, parentTag);
   fragment.setArguments(args);
   return fragment;
}

@Override
public void onAttach(Activity activity)
{
   super.onAttach(activity);

   // Collect the tag from the arguments
   String tag = getArguments().getString(PARENT_TAG);

   // Use the tag to get the parentFragment from the activity, which is (conveniently) available in onAttach()
   parentFragment = (ParentFragment) activity.getFragmentManager().findFragmentByTag(tag);
}

4) Теперь тыу вас есть ваш ParentFragment внутри вашего ChildFragment, и вы можете использовать его, когда вам это нужно, поэтому, где вы использовали это:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
{
     parentFragment = (ParentFragment) getParentFragment();
}
else
{
     parentFragment = ParentFragment.StaticThis;
}

Ты можешь сейчас:

parentFragment.justDoSomethingCoolWithIt(); // and prevent memory leaks through StaticThis ;-)
4

БИБЛИОТЕКА ПОДДЕРЖКИ ПРОСТОГО ИСПОЛЬЗОВАНИЯ С ФРАГМЕНТНОЙ ДЕЯТЕЛЬНОСТЬЮ.http://developer.android.com/reference/android/support/v4/app/Fragment.html#getParentFragment%28%29

О, здорово, это действительно полезно. Имя API такое же, getParentFragment (), поэтому возникла путаница, и я подумал, что .... эта функция не существует для API <16. Тем не менее, вы можете добавить больше описания, чтобы люди узнали об этом. Спасибо Nicks

Похожие вопросы