API getParentFragment 16

Мы все знаем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;
 CommonsWare04 дек. 2013 г., 14:17
Вложенные фрагменты не поддерживаются до API уровня 17 или с помощью пакета поддержки Android. Следовательно, нет понятия "родительский фрагмент " до API уровня 17. Ваш "решение" это утечка памяти.
 CommonsWare04 дек. 2013 г., 14:34
Поскольку ниже API 17 нет родительского фрагмента, невозможно общаться с родительским фрагментом ниже API 17.
 Snicolas24 июн. 2014 г., 22:28
@CommonsWare, возможны и другие способы. Например, я искал, могли бы мы сравнить ссылки каждого фрагмента с его childMananger и рекурсивно перебирать деревья, пока не найдете родительский фрагмент (у которого есть менеджер, дочерний фрагмент которого имеет дочерний).
 CommonsWare24 июн. 2014 г., 12:52
@Snicolas: Там нет понятия "родительский фрагмент "За исключением API уровня 17+ или использования фрагмента backport. Если вы находитесь на одном из них, используйте.getParentFragment()
 Mohsen Afshin04 дек. 2013 г., 14:24
Я использую ViewPager и должен говорить от предметов к контейнеру ViewPager. @ ComomWare так что естьНет безопасного способа вернуться к родительскому фрагменту (вызвать некоторый метод) ниже API 17?
 CommonsWare24 июн. 2014 г., 22:56
@Snicolas: Вы можетеЯ не принимаю ответ, так как это не ваш вопрос. И мой комментарий не отвечает ОП 'Вопрос (в основном потому, что ответа нет), поэтому я поставил его в качестве комментария.
 Snicolas26 июн. 2014 г., 22:32
И осталось 21 час @CommonsWare ..
 Snicolas26 июн. 2014 г., 12:09
@CommonsWare Вы правы, но у меня ожидают награды, и ваш комментарий отвечает моей награде, поэтому я думаю, что это будет полезно и для других.
 CommonsWare24 июн. 2014 г., 22:32
@Snicolas: если естьchildManagerТогда есть.getParentFragment()
 Snicolas24 июн. 2014 г., 22:44
@CommonsWare, лол, тытак хорошо. 17+ оба. Если вы хотите представить правильный ответ, я бы принял это ..

Ответы на вопрос(3)

На основании вашего комментария, если вы хотите поговорить с "Предметы" в вашем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, Это позволяет связываться между фрагментами и их контейнером без утечки памяти.

 Mohsen Afshin04 дек. 2013 г., 14:59
Сам родитель является Fragment, а не FragmentActivity, так что я могуне использовать onAttach, вместо этого я передаю его в качестве параметра конструктору дочерних фрагментов
 Rarw04 дек. 2013 г., 15:07
Ах, хорошо, вы все равно можете использовать интерфейс. Тот'лучше, чем статическая ссылка. Моя другая идея - использовать внутренний абстрактный класс, к которому вы получаете доступ из родительского класса. Таким образом, вы можете перезвонить фрагменту хоста таким образом. Вроде то же самое понятие, хотя.
 Rarw20 июн. 2014 г., 13:43
Idk спросить парня, который задал этот вопрос
 danny11720 июн. 2014 г., 13:20
Интерфейсы являются огромной частью программирования ОО. Почему так много вопросов по этому поводу?

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

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 ;-)

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

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

Ваш ответ на вопрос