Как я могу получить фрагмент из представления?

Я добавил Fragment в TableLayout и я хочу управлять ими из своей Activity, поэтому я использовал это:

Fragment fragment = (Fragment) tableLayout.getChildAt(i);

но getChildAt(int) возвращает View и View не могут быть добавлены в Fragment

Ответ 1

Я не понимаю, почему люди голодают на ваш вопрос. Fragments могут быть очень запутанными, особенно для начинающих. Чтобы понять вашу проблему, вы должны узнать, что такое Fragment и как они используются.

Для начала, View - это то, что существует на экране. Примеры включают: TextView, EditText, Button и т.д. Они размещаются внутри XML-макетов. Эти макеты отображаются с помощью Activity.

Теперь Fragment - это не View. Он вообще не существует на экране. Вместо этого это класс, который просто управляет "макетом" - подобным виду Activity. Если вам нужен вид, возвращаемый вашим фрагментом onCreateView(), вы можете напрямую использовать findViewById() в своей Activity.

Если вам нужна ссылка на ваш фрагмент, есть два возможных способа сделать это:

1) Если вы добавили Fragment программно, как это

getFragmentManager()
    .beginTransaction()
    .replace(R.id.fragment_container_viewgroup, myFragment, FRAGMENT_TAG)
    .commit();

Вы можете использовать:

MyFragment myFragment = (MyFragment) getFragmentManager().findFragmentByTag(FRAGMENT_TAG);

2) Если вы добавили фрагмент внутри XML-макета, например:

<fragment android:name="com.example.android.fragments.HeadlinesFragment"
    android:id="@+id/fragmentContainer"
    android:layout_weight="1"
    android:layout_width="0dp"
    android:layout_height="match_parent" />

Вы можете использовать это:

getFragmentManager().findFragmentById(R.id.fragmentContainer);

В основном, у каждой Activity есть класс FragmentManager который поддерживает все активные Fragments, и есть два способа их поиска: использование уникальной TAG, которую вы передаете, пока показываете фрагмент, или передаете идентификатор контейнера, где был добавлен фрагмент.

Ответ 2

Вы не можете получить такой фрагмент. Вам нужно будет добавить фрагмент с тегом и получить его с помощью этого тега.

для добавления фрагмента выполните следующие действия:

getFragmentManager().beginTransaction().add(R.id.container, fragment, "tagTofindFragment");

получить фрагмент:

fragment = getFragmentManager().findFragmentByTag("tagTofindFragment");

Здесь tagTofindFragment - это тег, который должен быть уникальным среди ваших фрагментов.