У меня есть фрагмент, который я пытаюсь добавить в представление.
FragmentManager fragMgr=getSupportFragmentManager();
feed_parser_activity content = (feed_parser_activity)fragMgr
.findFragmentById(R.id.feedContentContainer);
FragmentTransaction xaction=fragMgr.beginTransaction();
if (content == null || content.isRemoving()) {
content=new feed_parser_activity(item.getLink().toString());
xaction
.add(R.id.feedContentContainer, content)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.addToBackStack(null)
.commit();
Log.e("Abstract", "DONE");
}
Когда этот код выполняется, я получаю следующую ошибку в отладке ..
java.lang.IllegalArgumentException: No view found for id 0x7f080011
for fragment feed_parser_activity{41882f50 #2 id=0x7f080011}
feed_parser_activity
является фрагментом, который установлен на макет фрагмента в XML.
Я использую FragmentActivity для размещения макета фрагмента, содержащего feed_parser_layout
.
Я правильно кодирую это выше?
android
android-fragments
illegalargumentexception
coder_For_Life22
источник
источник
Ответы:
У меня была эта проблема тоже, пока я не понял , что указан неверный макет в
setContentView()
оonCreate()
способе FragmentActivity.Идентификатор, передаваемый в
FragmentTransaction.add()
, в вашем случаеR.id.feedContentContainer
, должен быть дочерним по отношению к макету, указанному вsetContentView()
.Вы не показали нам свой
onCreate()
метод, так что, возможно, это та же проблема.источник
TextView
внутриRelativeLayout
ребенок изRelativeLayout
.Эта ошибка также возникает при наличии вложенных фрагментов и добавлении их с помощью getSupportFragmentManager () вместо getChildFragmentManager ().
источник
Решение было использовать
getChildFragmentManager()
вместо того
getFragmentManager()
при звонке с фрагмента. Если вы вызываете метод из действия, используйте
getFragmentManager()
.Это решит проблему.
источник
getSupportFragmentManager()
.getFragmentManager()
уже устарел!У меня была эта проблема (при создании моего пользовательского интерфейса в коде), и она была вызвана тем, что у меня
ViewPager
(который показывалFragment
s) не было набора идентификаторов, поэтому я просто использовал,pager.setID(id)
и тогда это сработало.Эта страница помогла мне понять это.
источник
Другой сценарий, который я встретил. Если вы используете вложенные фрагменты, скажем ViewPager во фрагменте с его страницами, также фрагментами.
Когда вы делаете транзакцию фрагмента во внутреннем фрагменте (странице ViewPager), вам понадобится
getActivity () является ключом здесь. ...
источник
В моем случае я пытался показать DialogFragment, содержащий пейджер, и это исключение было вызвано, когда FragmentPagerAdapter попытался добавить фрагменты в пейджер. Основываясь на ответе howettl, я предполагаю, что это произошло из-за того, что родительский элемент Pager не был установлен в setContentView () в моем FragmentActivity
Единственное изменение, которое я сделал, чтобы решить эту проблему, - это создать FragmentPagerAdapter, передавая FragmentMager, полученный путем вызова getChildFragmentManager (), а не тот, который был получен путем вызова getFragmentManager (), как я обычно это делаю.
источник
Это исключение также может произойти, если идентификатор макета, который вы передаете,
FragmentTransaction.replace(int ID, fragment)
существует в других раздуваемых макетах. Убедитесь, что идентификатор макета уникален, и он должен работать.источник
Ответ, который я прочитал в другой ветке, похожей на ту, которая работала для меня, когда у меня возникла эта проблема, касалась макета XML.
Ваш logcat говорит "Нет просмотра для id 0x7f080011".
Откройте,
gen->package->R.java->id
а затем найдите идентификатор0x7f080011
.Когда у меня возникла эта проблема, этот идентификатор принадлежал
FrameLayout
в моемactivity_main.xml
файле.У FrameLayout не было идентификатора (не было оператора
android:id = "blablabla"
).Убедитесь, что все ваши компоненты во всех ваших макетах имеют идентификаторы, особенно компонент, указанный в logcat.
источник
Я получил эту ошибку при обновлении с
com.android.support:support-v4:21.0.0
доcom.android.support:support-v4:22.1.1
.Я должен был изменить свой макет из этого:
К этому:
Таким образом, макет ДОЛЖЕН иметь дочерний вид. Я предполагаю, что они применили это в новой библиотеке.
источник
С вложенными фрагментами
Для меня с помощью
getChildFragmentManager()
вместоgetActivity().getSupportFragmentManager()
решенного сбояисточник
Я знаю, что это уже было решено для одного сценария, но моя проблема была немного другой, и я подумала, что поделюсь, если кто-то еще на моем месте.
Я проводил транзакцию внутри
onCreate()
, но на этом этапе дерево представлений не было раздуто, поэтому вы получаете ту же ошибку. Ввод кода транзакции вonResume()
сделал все работает нормально.Так что просто убедитесь, что ваш код транзакции выполняется после того, как дерево представления было завышено!
источник
onAttach
. Смотрите мой ответЯ столкнулся с неприятной ошибкой при использовании Viewpager в Recycler View. Ниже ошибки я столкнулся в особой ситуации. Я начал фрагмент, который имел RecyclerView с Viewpager (используя FragmentStatePagerAdapter). Это работало хорошо до тех пор, пока я не переключился на другой фрагмент по щелчку ячейки в RecyclerView, а затем вернулся назад, используя аппаратную кнопку «Назад» телефона, и приложение упало.
И что забавно, так это то, что у меня было два ViewPager в одном RecyclerView, и оба были на расстоянии около 5 ячеек (другие не были видны на экране, они были отключены). Поэтому изначально я просто применил Решение к первому Viewpager и оставил другой как есть (Viewpager используя фрагменты).
Навигация назад работала нормально, когда был виден первый пейджер. Теперь, когда я прокрутил вниз до второго, а затем изменил фрагмент и вернулся, он потерпел крах (То же самое произошло с первым). Поэтому мне пришлось поменять оба виджета.
В любом случае, читайте ниже, чтобы найти рабочее решение. Ошибка сбоя ниже:
Потратил часы на его отладку. Прочитайте этот полный пост темы до конца, применяя все решения, включая проверку того, что я передаю childFragmentManager.
Ничего не получалось.
Наконец, вместо использования FragmentStatePagerAdapter я расширил PagerAdapter и использовал его в Viewpager без использования фрагментов. Я считаю, что некоторые, где есть ошибка с вложенными фрагментами. Во всяком случае, у нас есть варианты. Читать ...
Ниже ссылка была очень полезна:
Просмотр без фрагментов
Ссылка может умереть, поэтому я размещаю свое внедренное решение здесь:
}
Надеюсь, это было полезно!
источник
У меня была такая же проблема, но моя проблема происходила при смене ориентации. Ни одно из других решений не сработало. Вот и получается, что я забыл удалить
setRetainInstance(true);
из своих фрагментов, когда делал макет из двух или одной панели в зависимости от размера экрана.источник
Моя ошибка была на
FragamentTransaction
.Я делал это
t.replace(R.layout.mylayout);
вместоt.replace(R.id.mylayout);
Разница в том, что один является макетом, а другой является ссылкой на
layout(id)
источник
На всякий случай, если кто-то совершил ту же глупую ошибку, что и я; убедитесь, что вы не перезаписываете содержимое активности где-либо (то есть ищите дополнительные вызовы для setContentView)
В моем случае из-за неосторожного копирования и вставки я использовал DataBindingUtil.setContentView в своем фрагменте вместо DataBindingUtil.inflate, который испортил состояние действия.
источник
У меня была такая же проблема, позвольте мне опубликовать мой код, чтобы вы все могли его увидеть, а не делать то же самое, что я сделал.
Обратите внимание, что я настраивал фрагменты раньше, чем я
setContentView
. По электронной почте Ой.источник
setContentView
внутрьonBuildHeaders
Эта страница, кажется, является хорошим центральным местом для размещения предложений об исключительной ситуации фрагмента IllegalArgumentException. Вот еще одна вещь, которую вы можете попробовать. Вот что наконец-то сработало для меня:
Я забыл, что у меня был отдельный файл макета для альбомной ориентации. После того, как я добавил туда свой контейнер FrameLayout, фрагмент сработал.
С другой стороны, если вы уже попробовали все остальное, предложенное на этой странице (и во всем Интернете), и часами выдергивали свои волосы, подумайте о том, чтобы просто выбросить эти надоедливые фрагменты и вернуться к старой доброй стандартной компоновке. (Это именно то, чем я занимался, когда наконец обнаружил свою проблему.) Вы все еще можете использовать концепцию контейнера. Однако вместо того, чтобы заполнять его фрагментом, вы можете использовать
include
тег xml, чтобы заполнить его тем же макетом, который вы использовали бы в своем фрагменте. Вы можете сделать что-то вроде этого в вашем основном макете:где
former_fragment_layout
- имя файла макета xml, который вы пытались использовать в своем фрагменте. Посмотрите Повторное использование Макетов с включением для получения дополнительной информации.источник
В моем случае у меня был элемент SupportMapFragment в элементе представления рециркулятора (я использовал нижний заголовок «liteMode», который делает карту неинтерактивной, почти как статичное изображение). Я использовал правильный FragmentManager, и все, казалось, работало нормально ... с небольшим списком. Как только список элементов немного превысил высоту экрана, я начал испытывать эту проблему при прокрутке.
Оказалось, это потому, что я вставлял динамический SupportMapFragment в представление, которое было внутри другого фрагмента, чтобы обойти некоторые проблемы, которые у меня возникали при попытке объявить его статически в моем XML. Из-за этого компоновка местозаполнителя фрагмента могла быть заменена фактическим фрагментом только после того, как представление было присоединено к окну, то есть видно на экране. Поэтому я поместил свой код для инициализации SupportMapFragment, выполнения замены фрагмента и вызова getMapAsync () в событии onAttachedToWindow.
Что я забыл сделать, так это убедиться, что мой код не запускался дважды. Т.е. в событии onAttachedToWindow, проверьте, был ли мой динамический SupportMapFragment все еще нулевым, прежде чем пытаться создать его новый экземпляр и выполнить замену фрагмента. Когда элемент выходит за верхнюю часть RecyclerView, он отсоединяется от окна, а затем снова присоединяется, когда вы возвращаетесь к нему, так что это событие вызывается несколько раз.
После того, как я добавил нулевую проверку, это произошло только один раз для каждого элемента RecyclerView, и проблема исчезла! TL; DR!
источник
Это происходит, когда вы звоните из фрагмента внутри другого.
использовать:
источник
Я столкнулся с этой проблемой, когда попытался заменить представление своим фрагментом в
onCreateView()
. Как это:Мне сказали
Затем я исправил эту проблему с помощью замены
onActivityCreated()
. Как это:onCreateView()
чтобы вы могли заменить его позжеonActivityCreated()
Надеюсь это поможет!
источник
Я исправил эту ошибку, я использую
commitNow()
заменуcommit()
.Это
commitNow
метод синхронизации,commit()
метод является асинхронным методом.источник
В моем случае это исключение возникло, когда я использовал разные идентификаторы для одного и того же элемента макета (заполнителя фрагмента), в то время как у меня было несколько из них для разных вариантов сборки. По какой-то причине он работает отлично, когда вы заменяете фрагмент в первый раз, но если вы попытаетесь сделать это снова, вы получите это исключение. Поэтому убедитесь, что вы используете один и тот же идентификатор, если у вас есть несколько макетов для разных вариантов сборки.
источник
Если вы пытаетесь заменить фрагмент внутри фрагмента на,
fragmentManager
но вы не надуваете родительский фрагмент, это может вызвать проблему.В BaseFragment.java
OnCreateView
:Замените
super.onCreateView(inflater, container, savedInstanceState);
надуванием правильное расположение фрагмента:источник
У меня была такая же проблема, когда выполнял транзакцию фрагмента при создании активности.
Основная проблема в том, что Ник уже указал - дерево представлений еще не раздуто. Но его решение не сработало - такое же исключение в onResume, onPostCreate и т. Д.
Решение состоит в том, чтобы добавить обратный вызов к фрагменту контейнера, чтобы сообщить, когда он будет готов:
И тогда в деятельности:
источник
В моем случае я использовал файл класса фрагмента для объявления класса адаптера списка. Я просто использовал другой файл для класса общего адаптера, и ошибка исчезла.
источник
Эта проблема также происходит , когда вы не ставите
<include layout="@layout/your_fragment_layout"/>
в вашемapp_bar_main.xml
источник
Это происходит также, когда у вас есть два представления в двух фрагментах с одинаковыми идентификаторами
источник
У меня была та же проблема, что и была вызвана тем, что я пытался добавить фрагменты перед добавлением макета контейнера в действие.
источник
Иногда это потому, что вы используете BottomNavigationView. Если вы открываете Intent из навигации и в этом упражнении вы открываете фрагмент, скажем
тогда действие не сможет найти используемый вами способ навигации.
РЕШЕНИЕ. Измените действие на фрагмент и обработайте навигацию с помощью addOnBackStack в вашем приложении. Если вы внедрили Jetpack Navigation, просто используйте фрагменты в вашем проекте.
источник
В моем случае. У меня есть несколько
Activity
минут,Fragment
когда мне нужно восстановить,Fragment
когдаЯ очищаю все
Fragment
s и устанавливаю все вnull
в активность, но Fragment уже создает сам себя, в то время как для его активности на хосте установлено значение NULL, поэтому перед вызовом Fragment view проверьте его на NULL.например
источник