Intereting Posts

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 .
Я правильно кодирую это выше?

Solutions Collecting From Web of "Android Fragment для ID не найдено?"

У меня тоже была эта проблема, пока я не понял, что я указал неправильный макет в setContentView() метода onCreate() для FragmentActivity.

Идентификатор, переданный в FragmentTransaction.add() , в вашем случае R.id.feedContentContainer должен быть дочерним элементом макета, указанного в setContentView() .

Вы не показали нам свой onCreate() , поэтому, возможно, это та же проблема.

Эта ошибка также возникает при наличии вложенных фрагментов и их добавлении с помощью getSupportFragmentManager () вместо getChildFragmentManager ().

Решение заключалось в использовании

 getChildFragmentManager() 

вместо

 getFragmentManager() 

При вызове из фрагмента. Если вы вызываете метод из действия, используйте getFragmentManager ().

Это решит проблему.

У меня была эта проблема (при создании моего пользовательского интерфейса в коде), и это было вызвано моим ViewPager (который показал Fragment s), не имеющим идентификатор, поэтому я просто использовал pager.setID(id) а затем он работал.

Эта страница помогла мне разобраться.

Другой сценарий, который я встретил. Если вы используете вложенные фрагменты, скажем, ViewPager во Фрагменте с его страницами также Фрагменты.

Когда вы выполняете транзакцию фрагмента во внутреннем фрагменте (странице ViewPager), вам понадобится

 FragmentManager fragmentManager = getActivity().getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

Здесь присутствует ключ getActivity ().

Ответ, который я прочитал в другой теме, подобной этой, которая работала для меня, когда у меня была эта проблема, связана с макетом xml.

В вашем логарифме говорится: «Нет идентификатора для id 0x7f080011».

Откройте gen->package->R.java->id а затем найдите id 0x7f080011 .

Когда у меня была эта проблема, этот идентификатор принадлежал FrameLayout в файле activity_main.xml .

В макете фрейма не было идентификатора. Не было заявления android:id = "blablabla" .

Убедитесь, что все ваши компоненты во всех ваших макетах имеют идентификаторы, особенно компонент, указанный в logcat.

Я получил эту ошибку, когда обновился с 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> 

Поэтому макет ДОЛЖЕН иметь дочерний вид. Я предполагаю, что они применяют это в новой библиотеке.

Это исключение может также произойти, если идентификатор макета, который вы передаете в FragmentTransaction.replace(int ID, fragment) существует в других раздуваемых макетах. Убедитесь, что идентификатор макета уникален, и он должен работать.

У меня была такая же проблема, но моя проблема происходила при изменении ориентации. Ни один из других решений не работал. Получается, что я забыл удалить setRetainInstance(true); Из моих фрагментов, при выполнении двух или одной панели, основанной на размере экрана.

Я знаю, что об этом уже ответили по одному сценарию, но моя проблема была немного иной, и я подумал, что буду делиться случаем, если кто-то еще будет в моей обуви.

Я делал транзакцию внутри onCreate() , но на данный момент дерево просмотра не было завышено, поэтому вы получаете эту же ошибку. Ввод кода транзакции в onResume() заставлял все работать нормально.

Поэтому просто убедитесь, что ваш код транзакции работает после того, как дерево просмотра было завышено!

В моем случае я пытался показать DialogFragment, содержащий пейджер, и это исключение было брошено, когда FragmentPagerAdapter попытался добавить фрагменты к пейджеру. Основываясь на ответе howettl, я предполагаю, что это из-за родительского пейджера не было представлением, установленным в 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); pagerAdapter.setAdapter(pagerAdapter); return rootView; } 

}

Моя ошибка была в FragamentTransaction .

Я делал это t.replace(R.layout.mylayout); Вместо t.replace(R.id.mylayout);

Разница в том, что один является макетом, а другой – ссылкой на layout(id)

Я столкнулся с ошибкой Nasty при использовании Viewpager в представлении Recycler. Ниже ошибки я столкнулся в особой ситуации. Я начал фрагмент, который имел RecyclerView с Viewpager (используя FragmentStatePagerAdapter). Он работал хорошо, пока я не переключился на другой фрагмент при щелчке ячейки в RecyclerView, а затем перешел обратно с помощью аппаратной кнопки «Назад» телефона и приложения.

И что смешно в том, что у меня было два наблюдателя в одном и том же 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 без использования фрагментов. Я считаю, что там, где есть BUG с вложенными фрагментами. Во всяком случае, у нас есть варианты. Читать …

Ниже ссылка была очень полезной:

Просмотрщик без фрагментов

Ссылка может погибнуть, поэтому я размещаю свое реализованное решение ниже:

 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; } 

}

Надеюсь, это было полезно!

У меня была такая же проблема, позвольте мне опубликовать мой код, чтобы вы все могли его увидеть, а не делать то же самое, что и я.

 @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 . По электронной почте Ой.

Эта страница, по-видимому, является хорошим центральным местом для публикации предложений об исключении Flegment IllegalArgumentException. Вот еще одна вещь, которую вы можете попробовать. Это то, что окончательно сработало для меня:

Я забыл, что у меня есть отдельный файл макета для пейзажной ориентации. После того как я добавил контейнер FrameLayout, там тоже работал фрагмент.


Отдельно обратите внимание, что если вы уже пробовали все, что было предложено на этой странице (и весь Интернет тоже), а часами вытягивали волосы, подумайте о том, чтобы просто сбросить эти досадные фрагменты и вернуться к старой старой стандартной схеме. (На самом деле это то, чем я занимался, когда наконец обнаружил свою проблему.) Вы все еще можете использовать концепцию контейнера. Однако вместо заполнения фрагмента вы можете использовать тег include xml, чтобы заполнить его тем же самым макетом, который вы использовали бы в своем фрагменте. Вы могли бы сделать что-то подобное в своем основном макете:

 <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, который вы пытались использовать в своем фрагменте. См. « Повторное использование макетов с включением» для получения дополнительной информации.

Всегда очищайте свой проект после изменения чего-либо в файлах макета xml.

На затмении: Project> Clean

Я столкнулся с этой проблемой, когда попытался заменить вид своим фрагментом в 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(); } 
  1. Вы должны вернуть представление в onCreateView() чтобы впоследствии его можно было заменить
  2. Вы можете применить любую операцию к этому представлению в следующей функции в методе liftcycle, например onActivityCreated()

Надеюсь это поможет!

В моем случае у меня был файл SupportMapFragment в элементе просмотра recycler (я использовал нижний служебный «liteMode», который делает карту отображаемой как неинтерактивная, почти как статическое изображение). Я использовал правильный FragmentManager, и все, казалось, отлично работало … с небольшим списком. После того, как список элементов немного превысил высоту экрана, я начал получать эту проблему при прокрутке.

Оказалось, это было потому, что я вводил динамический SupportMapFragment внутри представления, которое находилось внутри другого фрагмента, чтобы обойти некоторые проблемы, которые у меня возникали при попытке объявить его статически в моем XML. Из-за этого компоновщик замещающего фрагмента может быть заменен только фактическим фрагментом, когда вид был прикреплен к окну, то есть видимый на экране. Поэтому я поместил свой код для инициализации SupportMapFragment, заменив фрагмент и вызвав getMapAsync () в событии onAttachedToWindow.

Я забыл сделать, чтобы мой код не запускался дважды. Т.е. в событии onAttachedToWindow проверьте, был ли мой динамический SupportMapFragment все еще нулевым, прежде чем пытаться создать его новый экземпляр и заменить Fragment. Когда элемент выходит из верхней части RecyclerView, он отсоединяется от окна, а затем снова присоединяется при прокрутке назад к нему, поэтому это событие запускается несколько раз.

Когда я добавил нулевую проверку, это произошло только один раз за элемент RecyclerView, и проблема исчезла! TL; DR!

Если вы пытаетесь заменить фрагмент внутри фрагмента на 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); 

У меня была та же проблема, когда выполнялась операция фрагмента при создании активности.

Основная проблема заключается в том, что Ник уже указал – дерево просмотров еще не завышено. Но его решение не сработало – одно и то же исключение в 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(); } //... } 

В моем случае я использовал файл класса фрагмента, чтобы объявить класс адаптера listview. Я просто использовал другой файл для общедоступного класса адаптера, и ошибка исчезла.

У меня была такая же ошибка, и после многих попыток я обнаружил, что проблема была в идентификаторе пейджера. Я использовал 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" /> 

Внутри фрагмента используйте это:

 int id = this.getId();