По моему main.xml
у меня
<FrameLayout
android:id="@+id/frameTitle"
android:padding="5dp"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:background="@drawable/title_bg">
<fragment
android:name="com.fragment.TitleFragment"
android:id="@+id/fragmentTag"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</FrameLayout>
И я устанавливаю фрагмент объекта, как это
FragmentManager fragmentManager = activity.getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment newFragment = new FragmentType1();
fragmentTransaction.replace(R.id.frameTitle, casinodetailFragment, "fragmentTag");
// fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
Он устанавливает разные типы объектов Fragment ( FragmentType2,FragmentType3,...
) в разное время. Теперь в какой-то момент мне нужно определить, какой объект в данный момент находится там.
В короткий мне нужно сделать что - то вроде этого:
Fragment currentFragment = //what is the way to get current fragment object in FrameLayout R.id.frameTitle
Я попробовал следующее
TitleFragment titleFragmentById = (TitleFragment) fragmentManager.findFragmentById(R.id.frameTitle);
и
TitleFragment titleFragmentByTag = (TitleFragment) fragmentManager.findFragmentByTag("fragmentTag");
Но оба объекта (titleFragmentById и titleFragmentByTag) -null
Я что-то пропустил?
Я использую Compatibility Package, r3
и разрабатываю для API level 7
.
findFragmentById()
и findFragmentByTag()
будет работать, если мы установили фрагмент с помощью fragmentTransaction.replace
или fragmentTransaction.add
, но будет, return null
если мы установили объект в XML (как то, что я сделал в моем main.xml
). Я думаю, что чего-то не хватает в моих файлах XML.
источник
Ответы:
Вызов
findFragmentById()
наFragmentManager
и определить , какой фрагмент находится в вашемR.id.frameTitle
контейнере.источник
fragmentTransaction.replac
e или,fragmentTransaction.add
но не получится, если мы установили его на xml. См. Мое редактирование 2findFragmentByTag
возвращает ноль в случаеActionBar
вкладок. В моемActivity
расширенииActionBarActivity
я сначала добавляю вкладки,ActionBar
а потом нахожу его!executePendingTransactions()
наFragmentManager
после вызоваcommit()
на сделку, хотя я не пробовал. Или вы можете использоватьsetContentView()
файл макета с<fragment>
тегом. Любое из этих событий происходит синхронно, и поэтому фрагмент будет существовать внутри самогоonCreate()
вызова, где вы использовалиexecutePendingTransaction()
илиsetContentView()
. В противном случае обычныйFragmentTransaction
процесс обрабатывается асинхронно, и он даже не начнется к концу времениonCreate()
.Попробуй это,
это даст вам текущий фрагмент, затем вы можете сравнить его с классом фрагмента и выполнить ваши действия.
источник
getSupportFragmentManager()
вместо этого, и будет нулевой безsupport
частиЯ думаю, что вы можете использовать событие onAttachFragment, может быть полезно, чтобы поймать, какой фрагмент активен.
источник
Я думаю, что вы должны сделать:
Причина в том, что вы устанавливаете тэг «fragTag» на последний добавленный вами фрагмент (когда вы вызываете replace).
источник
fragmentTransaction.replac
e или,fragmentTransaction.add
но не получится, если мы установили его на xml. См. Мое редактирование 2fragmentTag
является ли тег для текущего фрагмента?Вы можете получить список фрагментов и посмотреть на последний.
Но иногда (при переходе назад) размер списка остается прежним, но некоторые из последних элементов являются нулевыми. Так что в списке я итерировал до последнего ненулевого фрагмента и использовал его.
источник
getFragments()
метод. Он помечен@hide
и не должен был быть включен в jar библиотеки поддержки. Его не следует рассматривать как часть экспортируемого API.getFragments()
делает, потому что он вам нужен довольно часто. Я думаю, что это на самом деле публично сейчас тоже.Это самое простое решение и работа для меня.
1.) Вы добавляете свой фрагмент
2.)
источник
Возможно, уже поздно, но я надеюсь, что это поможет кому-то еще, также @CommonsWare опубликовал правильный ответ.
источник
Может быть, самый простой способ это:
У меня сработало
источник
Вы можете создать поле в родительском классе деятельности:
И затем внутри каждого класса фрагмента:
Ваше поле 'fr' является текущим фрагментом Object
Работает также с popBackStack ()
источник
Я знаю, что это было давно, но я сделаю это здесь, если это кому-нибудь поможет.
На данный момент правильный ответ (и выбранный) - это ответ CommonsWare. У меня была такая же проблема, как опубликовано, следующее
продолжал возвращать ноль. Моя ошибка была действительно глупой, в моем XML-файле:
Ошибка была в том, что у меня был android: тег INSTEAD OF android: id .
источник
Ответ @Hammer работал на меня, я использую, чтобы управлять плавающей кнопкой действия
источник
Если вы выходите из AbstractActivity, вы можете использовать метод getFragments ():
источник
Если вы определяете фрагмент в XML-структуре действия, то
Activity
убедитесь, что вы вызываетеsetContentView()
перед вызовомfindFragmentById()
.источник
Если вы используете BackStack ... и ТОЛЬКО если вы используете задний стек, попробуйте это:
источник
Это даст вам имя текущего фрагмента класса ->
источник
Выполните проверку (какой фрагмент в контейнере активности) в методе onStart;
Некоторые проверяют:
источник