Android Fragment для ID не найдено?
У меня есть фрагмент, который я пытаюсь добавить в представление.
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
.
Я правильно кодирую это выше?
Ответы
Ответ 1
У меня тоже была эта проблема, пока я не понял, что я указал неправильный макет в setContentView()
метода onCreate()
функции FragmentActivity.
Идентификатор, переданный в FragmentTransaction.add()
, в вашем случае R.id.feedContentContainer
должен быть дочерним элементом макета, указанным в setContentView()
.
Вы не показали нам свой метод onCreate()
, поэтому, возможно, это та же проблема.
Ответ 2
Эта ошибка также возникает при наличии вложенных фрагментов и добавления их с помощью getSupportFragmentManager() вместо getChildFragmentManager().
Ответ 3
Решение заключалось в использовании getChildFragmentManager()
вместо getFragmentManager()
при вызове из фрагмента. Если вы вызываете метод из действия, используйте getFragmentManager()
.
Это решит проблему.
Ответ 4
У меня была эта проблема (при создании моего пользовательского интерфейса в коде), и это было вызвано моим ViewPager
(который показал Fragment
s), не имеющим идентификатор, поэтому я просто использовал pager.setID(id)
, а затем он сработал.
Эта страница помогла мне понять это.
Ответ 5
Другой сценарий, который я встречал.
Если вы используете вложенные фрагменты, скажем, ViewPager в фрагменте, с ним страницы также Фрагменты.
Когда вы выполняете транзакцию фрагмента во внутреннем фрагменте (страница ViewPager), вам понадобится
FragmentManager fragmentManager = getActivity().getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
getActivity() - это ключ.
...
Ответ 6
Ответ, который я прочитал в другой ветке, похожей на ту, которая работала для меня, когда у меня возникла эта проблема, касалась макета XML.
Ваш logcat говорит: "Для id 0x7f080011 не найдено ни одного представления".
Откройте gen->package->R.java->id
и найдите идентификатор 0x7f080011
.
Когда у меня возникла эта проблема, этот идентификатор принадлежал FrameLayout
в моем файле activity_main.xml
.
У FrameLayout не было идентификатора (не было оператора android:id = "blablabla"
).
Убедитесь, что все ваши компоненты во всех ваших макетах имеют идентификаторы, особенно компонент, указанный в logcat.
Ответ 7
Это исключение может также произойти, если идентификатор макета, который вы передаете в FragmentTransaction.replace(int ID, fragment)
, существует в других раздуваемых макетах. Убедитесь, что идентификатор макета уникален, и он должен работать.
Ответ 8
Я получил эту ошибку, когда обновился с com.android.support:support-v4:21.0.0
до com.android.support:support-v4:22.1.1
.
Мне пришлось изменить свой макет из этого:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container_frame_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
Для этого:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/container_frame_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
</FrameLayout>
Таким образом, макет MUST имеет дочернее представление. Я предполагаю, что они применяют это в новой библиотеке.
Ответ 9
В моем случае я пытался показать DialogFragment, содержащий пейджер, и это исключение было вызвано, когда FragmentPagerAdapter попытался добавить фрагменты в пейджер. Основываясь на ответе howettl, я предполагаю, что это было из-за того, что родитель Pager не был представлением, установленным в setContentView() в моей FragmentActivity.
Единственное изменение, которое я сделал, чтобы решить эту проблему, - это создать FragmentPagerAdapter, передавая FragmentMager, полученный путем вызова getChildFragmentManager(), а не тот, который был получен путем вызова getFragmentManager(), как я обычно делаю.
public class PagerDialog extends DialogFragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.pager_dialog, container, false);
MyPagerAdapter pagerAdapter = new MyPagerAdapter(getChildFragmentManager());
ViewPager pager = (ViewPager) rootView.findViewById(R.id.pager);
pager.setAdapter(pagerAdapter);
return rootView;
}
}
Ответ 10
Я знаю, что это уже ответили на один сценарий, но моя проблема была немного иной, и я думал, что буду делиться тем, что кто-то еще боится.
Я делал транзакцию внутри onCreate()
, но на данный момент дерево просмотра не было завышено, поэтому вы получите эту же ошибку. Ввод кода транзакции в onResume()
заставил все работать нормально.
Поэтому просто убедитесь, что ваш код транзакции запущен после того, как дерево просмотров было завышено!
Ответ 11
У меня была такая же проблема, но моя проблема произошла при изменении ориентации. Ни один из других решений не работал. Таким образом, оказывается, что я забыл удалить setRetainInstance(true);
из моих фрагментов, когда делаю двух или одну панель, основанный на размере экрана.
Ответ 12
Я столкнулся с неприятной ошибкой при использовании Viewpager в Recycler View. Ниже ошибки я столкнулся в особой ситуации. Я начал фрагмент, который имел RecyclerView с Viewpager (используя FragmentStatePagerAdapter). Это работало хорошо до тех пор, пока я не переключился на другой фрагмент по щелчку ячейки в RecyclerView, а затем вернулся обратно с помощью кнопки "Назад" аппаратного обеспечения телефона и приложение рухнуло.
И что забавно, это то, что у меня было два ViewPager в одном RecyclerView, и оба были на расстоянии около 5 ячеек (другие не были видны на экране, они были отключены). Поэтому изначально я просто применил Решение к первому Viewpager и оставил другой как есть (Viewpager используя фрагменты).
Навигация назад работала нормально, когда был виден первый пейджер. Теперь, когда я прокрутил вниз до второго, а затем изменил фрагмент и вернулся, он потерпел крах (То же самое произошло с первым). Поэтому мне пришлось поменять оба виджета.
В любом случае, читайте ниже, чтобы найти рабочее решение. Ошибка сбоя ниже:
java.lang.IllegalArgumentException: No view found for id 0x7f0c0098 (com.kk:id/pagerDetailAndTips) for fragment ProductDetailsAndTipsFragment{189bcbce #0 id=0x7f0c0098}
Потратил часы на его отладку. Прочитайте этот полный пост темы до конца, применяя все решения, включая проверку того, что я передаю childFragmentManager.
Ничего не получалось.
Наконец, вместо использования FragmentStatePagerAdapter я расширил PagerAdapter и использовал его в Viewpager без использования фрагментов. Я считаю, что некоторые, где есть ошибка с вложенными фрагментами. Во всяком случае, у нас есть варианты. Читать...
Ниже ссылка была очень полезна:
Просмотр без фрагментов
Ссылка может умереть, поэтому я размещаю свое внедренное решение здесь:
public class ScreenSlidePagerAdapter extends PagerAdapter {
private static final String TAG = "ScreenSlidePager";
ProductDetails productDetails;
ImageView imgProductImage;
ArrayList<Imagelist> imagelists;
Context mContext;
// Constructor
public ScreenSlidePagerAdapter(Context mContext,ProductDetails productDetails) {
//super(fm);
this.mContext = mContext;
this.productDetails = productDetails;
}
// Here is where you inflate your View and instantiate each View and set their values
@Override
public Object instantiateItem(ViewGroup container, int position) {
LayoutInflater inflater = LayoutInflater.from(mContext);
ViewGroup layout = (ViewGroup) inflater.inflate(R.layout.product_image_slide_cell,container,false);
imgProductImage = (ImageView) layout.findViewById(R.id.imgSlidingProductImage);
String url = null;
if (imagelists != null) {
url = imagelists.get(position).getImage();
}
// This is UniversalImageLoader Image downloader method to download and set Image onto Imageview
ImageLoader.getInstance().displayImage(url, imgProductImage, Kk.options);
// Finally add view to Viewgroup. Same as where we return our fragment in FragmentStatePagerAdapter
container.addView(layout);
return layout;
}
// Write as it is. I don't know much about it
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
/*super.destroyItem(container, position, object);*/
}
// Get the count
@Override
public int getCount() {
int size = 0;
if (productDetails != null) {
imagelists = productDetails.getImagelist();
if (imagelists != null) {
size = imagelists.size();
}
}
Log.d(TAG,"Adapter Size = "+size);
return size;
}
// Write as it is. I don't know much about it
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
}
Надеюсь, это было полезно!
Ответ 13
Моя ошибка была на FragamentTransaction
.
Я делал это t.replace(R.layout.mylayout);
вместо t.replace(R.id.mylayout);
Разница в том, что один является макетом, а другой - ссылкой на layout(id)
Ответ 14
С вложенными фрагментами
При использовании getChildFragmentManager()
вместо getActivity.getSupportFragmentManager()
java.lang.IllegalArgumentException: для меня не найдено представление для идентификатора.
Ответ 15
На всякий случай, если кто-то совершил ту же глупую ошибку, что и я; убедитесь, что вы не перезаписываете содержимое активности где-либо (то есть ищите дополнительные вызовы для setContentView)
В моем случае из-за неосторожного копирования и вставки я использовал DataBindingUtil.setContentView в своем фрагменте вместо DataBindingUtil.inflate, который испортил состояние действия.
Ответ 16
У меня была такая же проблема, позвольте мне опубликовать мой код, чтобы вы все могли его увидеть, а не делать то же самое, что и я.
@Override
protected void onResume()
{
super.onResume();
fragManager = getSupportFragmentManager();
Fragment answerPad=getDefaultAnswerPad();
setAnswerPad(answerPad);
setContentView(R.layout.abstract_test_view);
}
protected void setAnswerPad(AbstractAnswerFragment pad)
{
fragManager.beginTransaction()
.add(R.id.AnswerArea, pad, "AnswerArea")
.commit();
fragManager.executePendingTransactions();
}
Обратите внимание, что я настраивал фрагменты до я setContentView
. По электронной почте Ой.
Ответ 17
Эта страница, по-видимому, является хорошим центральным местом для публикации предложений об исключении фрагмента IllegalArgumentException. Вот еще одна вещь, которую вы можете попробовать. Это то, что окончательно сработало для меня:
Я забыл, что у меня есть отдельный файл макета для альбомной ориентации. После того, как я добавил контейнер FrameLayout, тоже работал фрагмент.
В отдельном примечании, если вы уже пробовали все, что было предложено на этой странице (и весь Интернет тоже), и часами вытягивали волосы, подумайте о том, чтобы просто сбросить эти раздражающие фрагменты и вернуться к добрым старым стандартная компоновка. (Это на самом деле то, что я делал, когда наконец обнаружил свою проблему.) Вы все еще можете использовать концепцию контейнера. Однако вместо заполнения фрагмента вы можете использовать тег xml include
, чтобы заполнить его тем же самым макетом, который вы использовали бы в своем фрагменте. Вы могли бы сделать что-то подобное в своем основном макете:
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<include layout="@layout/former_fragment_layout" />
</FrameLayout>
где former_fragment_layout
- это имя файла макета xml, который вы пытались использовать в своем фрагменте. См. Повторное использование макетов с включением для получения дополнительной информации.
Ответ 18
В моем случае у меня был SupportMapFragment в элементе просмотра recycler (я использовал нижний служебный "liteMode", который делает карту неактивной, как статическое изображение). Я использовал правильный FragmentManager, и все, казалось, отлично работало... с небольшим списком. После того, как список элементов немного превысил высоту экрана, я начал получать эту проблему при прокрутке.
Оказалось, это было потому, что я вводил динамический SupportMapFragment внутри представления, которое находилось внутри другого фрагмента, чтобы обойти некоторые проблемы, которые у меня возникали при попытке объявить его статически в моем XML. Из-за этого компоновщик замещающего фрагмента может быть заменен только фактическим фрагментом, когда вид был прикреплен к окну, то есть видимый на экране. Поэтому я поместил свой код для инициализации SupportMapFragment, выполнив замену фрагмента и вызвав getMapAsync() в событии onAttachedToWindow.
Что я забыл сделать, так это убедиться, что мой код не запускался дважды. То есть в событии onAttachedToWindow, проверьте, был ли мой динамический SupportMapFragment еще null, прежде чем пытаться создать его новый экземпляр и заменить Fragment. Когда элемент выходит из верхней части RecyclerView, он отсоединяется от окна, а затем снова присоединяется при прокрутке назад к нему, поэтому это событие запускается несколько раз.
Как только я добавил нулевую проверку, это произошло только один раз за элемент RecyclerView, и проблема исчезла! TL;! DR
Ответ 19
Всегда очищайте свой проект после изменения чего-либо в файлах макета xml.
В eclipse: Project > Clean
Ответ 20
Я столкнулся с этой проблемой, когда попытался заменить вид своим фрагментом в onCreateView()
. Вот так:
public class MyProjectListFrag extends Fragment {
private MyProjectListFragment myProjectListFragment;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
FragmentManager mFragmentManager = getFragmentManager();
myProjectListFragment = new MyProjectListFragment();
mFragmentManager
.beginTransaction()
.replace(R.id.container_for_my_pro_list,
myProjectListFragment, "myProjectListFragment")
.commit();
}
Он сказал мне
11-25 14:06:04.848: E/AndroidRuntime(26040): java.lang.IllegalArgumentException: No view found for id 0x7f05003f (com.example.myays:id/container_for_my_pro_list) for fragment MyProjectListFragment{41692f40 #2 id=0x7f05003f myProjectListFragment}
Затем я исправил эту проблему, заменив ее на onActivityCreated()
. Вот так:
public class MyProjectListFrag extends Fragment {
private final static String TAG = "lch";
private MyProjectListFragment myProjectListFragment;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater
.inflate(R.layout.frag_my_project_list, container, false);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
FragmentManager mFragmentManager = getFragmentManager();
myProjectListFragment = new MyProjectListFragment();
mFragmentManager
.beginTransaction()
.replace(R.id.container_for_my_pro_list,
myProjectListFragment, "myProjectListFragment")
.commit();
}
- Вы должны вернуть представление в
onCreateView()
, чтобы позднее его можно было заменить
- Вы можете поместить любую операцию в это представление в следующую функцию в методе liftcycle, например
onActivityCreated()
Надеюсь, это поможет!
Ответ 21
Это происходит, когда вы звоните из фрагмента внутри другого.
использовать:
getActivity().getSupportFragmentManager().beginTransaction();
Ответ 22
В моем случае это исключение возникло, когда я использовал разные идентификаторы для одного и того же элемента макета (заполнителя фрагмента), в то время как у меня было несколько из них для разных вариантов сборки. По какой-то причине он отлично работает, когда вы заменяете фрагмент в первый раз, но если вы попытаетесь сделать это снова, вы получите это исключение. Поэтому убедитесь, что вы используете один и тот же идентификатор, если у вас есть несколько макетов для разных вариантов сборки.
Ответ 23
Я исправил эту ошибку, я использую commitNow()
replace commit()
.
mFragment.getChildFragmentManager()
.beginTransaction()
.replace(R.id.main_fragment_container,fragment)
.commitNowAllowingStateLoss();
commitNow
- это метод синхронизации, а метод commit()
- это асинхронный метод.
Ответ 24
Если вы пытаетесь заменить фрагмент внутри фрагмента на fragmentManager
, но вы не раздуваете родительский фрагмент, который может вызвать проблему.
В BaseFragment.java OnCreateView
:
if (savedInstanceState == null) {
getFragmentManager().beginTransaction()
.replace(R.id.container, new DifferentFragment())
.commit();
}
return super.onCreateView(inflater, container, savedInstanceState);
Заменить super.onCreateView(inflater, container, savedInstanceState);
с раздуванием правильной компоновки для фрагмента:
return inflater.inflate(R.layout.base_fragment, container, false);
Ответ 25
У меня была та же проблема, когда выполнялась операция фрагмента при создании активности.
Основная проблема заключается в том, что Ник уже указал - дерево просмотров еще не завышено. Но его решение не сработало - одно и то же исключение в onResume, onPostCreate и т.д.
Решение состоит в том, чтобы добавить обратный вызов к фрагменту контейнера для подачи сигнала, когда он готов:
public class MyContainerFragment extends Fragment {
public static interface Callbacks {
void onMyContainerAttached();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
Log.d(TAG, "--- onAttach");
((Callbacks) activity).onMyContainerAttached();
}
//... rest of code
}
А затем в действии:
public class MainActivity extends Activity
implements MyContainerFragment.Callbacks
{
@Override
public void onMyContainerAttached() {
getFragmentManager()
.beginTransaction()
.replace(R.id.containerFrame, new MyFragment())
.commit();
}
//...
}
Ответ 26
В моем случае я использовал файл класса фрагмента, чтобы объявить класс адаптера listview.
Я просто использовал другой файл для общедоступного класса адаптера, и ошибка исчезла.
Ответ 27
Эта проблема также возникает, когда вы не помещаете <include layout="@layout/your_fragment_layout"/>
в свой app_bar_main.xml
Ответ 28
Это происходит также, когда у вас есть два представления в двух фрагментах с одинаковыми идентификаторами
Ответ 29
У меня была та же проблема, это было вызвано тем, что я пытался добавить фрагменты перед добавлением макета контейнера в действие.
Ответ 30
У меня была такая же ошибка, и, попробовав много вещей, я обнаружил, что проблема связана с идентификатором пейджера.
Я использовал android:id="@+id/someName"
, вместо этого вы должны использовать:
<android.support.v4.view.ViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />