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" />