it-swarm.com.ru

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

233
coder_For_Life22

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

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

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

316
howettl

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

225
Malachiasz

Решение было использовать getChildFragmentManager()

вместо getFragmentManager()

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

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

48
Sterling Diaz

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

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

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

getActivity () является ключом здесь .

25
zdd

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

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

25
kaka

Я получил эту ошибку при обновлении с 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> 

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

11
ono

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

Ваш logcat говорит "Нет просмотра для id 0x7f080011". 

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

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

У FrameLayout не было идентификатора (не было оператора Android:id = "blablabla").

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

11
scottyseus

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

9
ealihodzic

В моем случае я пытался показать 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);
    pagerAdapter.setAdapter(pagerAdapter);

    return rootView;
}

}

7
garibay

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

7
VM4

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

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

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

6
Nick

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

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

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

5
mut tony

Я столкнулся с неприятной ошибкой при использовании 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;
}

}

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

5
Nilesh

С вложенные фрагменты  

Использование getChildFragmentManager() вместо getActivity.getSupportFragmentManager() решило аварийное завершение Java.lang.IllegalArgumentException: для меня не найдено представление для id.

5
UdayaLakmal

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

3
Suragch

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

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

3
PearsonArtPhoto

На всякий случай, если кто-то совершил ту же глупую ошибку, что и я; убедитесь, что вы не перезаписываете содержимое активности где-либо (то есть ищите дополнительные вызовы для setContentView)

В моем случае из-за неосторожного копирования и вставки я использовал DataBindingUtil.setContentView в своем фрагменте вместо DataBindingUtil.inflate, который испортил состояние действия.

3
Squimon

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

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

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

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

2
Breeno

Всегда очищайте свой проект после внесения изменений в файлы макетов XML.

На Eclipse: Проект> Чистый

2
Zafer

Я исправил эту ошибку, я использую commitNow() replace commit()

mFragment.getChildFragmentManager()
  .beginTransaction()
  .replace(R.id.main_fragment_container,fragment)
  .commitNowAllowingStateLoss();

commitNow - это метод синхронизации, метод commit() - это асинхронный метод.

1
user1232595

В моем случае это исключение возникло, когда я использовал разные идентификаторы для одного и того же элемента макета (заполнителя фрагмента), в то время как у меня было несколько из них для разных вариантов сборки. По какой-то причине он отлично работает, когда вы заменяете фрагмент в первый раз, но если вы попытаетесь сделать это снова, вы получите это исключение . Поэтому убедитесь, что вы используете один и тот же идентификатор, если у вас есть несколько макетов для разных сборок. Варианты.

1
T.K.

Я столкнулся с этой проблемой, когда попытался заменить представление своим фрагментом в 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}

Затем я исправил эту проблему, поместив replace в 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()

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

1
Stephen Lin

Это происходит, когда вы звоните из фрагмента внутри другого.

использовать: 

getActivity().getSupportFragmentManager().beginTransaction();
1
Arvin Sanaei

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

Эта проблема также возникает, когда вы не помещаете <include layout="@layout/your_fragment_layout"/> в свой app_bar_main.xml

0
Bbake Waikhom

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

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

    //...
}
0
Alexander Malakhov

У меня была та же проблема, моя ошибка была в том, что я забыл добавить код framlayout xml в другой макет (для другого языка) действия. мое приложение было создано для нескольких языков, поэтому у меня было два макета для каждого вида деятельности. справа налево и слева направо 

0
tahaDev

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

0
Gauss

Контейнер для фрагмента это означает framelayout или любой макет, в котором вы заменяете фрагмент, там нет, что вызывает проблему, надеюсь, поможет

Удачного кодирования!

0
blackHawk

Это происходит также, когда у вас есть два представления в двух фрагментах с одинаковыми идентификаторами

0
Hossam Hassan

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

0
Rohit