API getParentFragment 16

Мы все знаем, что getParentFragment of 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; 

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

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

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

(3) Внедрите интерфейс в свой FragmentActivity .

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

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

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

2) В ParentFragment соберите тег (используя «this») и добавьте его в 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 через параметр «activity» from 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