Фрагмент Android для ID не найден? - PullRequest
253 голосов
/ 22 сентября 2011

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

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

Ответы [ 28 ]

335 голосов
/ 17 ноября 2011

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

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

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

240 голосов
/ 09 августа 2013

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

59 голосов
/ 06 февраля 2015

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

вместо getFragmentManager()

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

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

28 голосов
/ 19 сентября 2012

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

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

26 голосов
/ 17 июня 2015

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

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

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

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

12 голосов
/ 30 мая 2013

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

Ваш logcat говорит: "Нет идентификатора для id 0x7f080011".

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

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

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

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

11 голосов
/ 28 апреля 2015

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

В моем случае я пытался показать 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;
    }
}
11 голосов
/ 30 сентября 2012

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

7 голосов
/ 05 января 2014

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...