Ява.ленг.IllegalArgumentException: не найдено представлений для id 0x1020002 (android:id/content) для фрагмента

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

    java.lang.IllegalArgumentException: No view found for id 0x1020002 (android:id/content) for fragment PhotosFragment2{41a57218 #3 id=0x1020002}
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:930)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1115)
            at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
            at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1478)
            at android.support.v4.app.FragmentManagerImpl.run(FragmentManager.java:446)
            at android.os.Handler.handleCallback(Handler.java:615)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:153)
            at android.app.ActivityThread.main(ActivityThread.java:5086)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:821)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
            at dalvik.system.NativeStart.main(Native Method)

Ниже приведены классы.Я использовал следующий код для транзакции фрагмента

Fragment fragment = new PhotosFragment2();

                        FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
                        fragmentTransaction.replace(android.R.id.content, fragment);
                        fragmentTransaction.commit();

PhotosFragment.java

   public class PhotosFragment extends Fragment {
        private FragmentActivity myContext;
        @Override
        public void onAttach(Activity activity) {
            myContext = (FragmentActivity) activity;
            super.onAttach(activity);
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {

            View rootView = inflater.inflate(R.layout.photos, container, false);

            rootView.setVerticalScrollBarEnabled(false);
            int[] mThumbIds = {
                    R.drawable.album8, R.drawable.album3,
                    R.drawable.album4, R.drawable.album8,
                    R.drawable.album6, R.drawable.album7,
                    R.drawable.album12, R.drawable.album10,
            };

            int[] mThumbIds2 = {
                    R.drawable.album8, R.drawable.album3,
                    R.drawable.album4,
                    R.drawable.album6, R.drawable.album7,
                    R.drawable.album9, R.drawable.album10,
                    R.drawable.album11, R.drawable.album12, R.drawable.album8,
                    R.drawable.album8, R.drawable.album3,
                    R.drawable.album4,
                    R.drawable.album6, R.drawable.album7,
                    R.drawable.album9, R.drawable.album10,
                    R.drawable.album11, R.drawable.album12, R.drawable.album8,
            };

            CustomGridSingle2 adapter = new CustomGridSingle2(myContext, mThumbIds);
            GridView grid = (GridView)rootView.findViewById(R.id.gridView);
            final ImageView img= (ImageView)rootView.findViewById(R.id.imageView7);
            grid.setFocusable(false);

            grid.setAdapter(adapter);
    grid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Fragment fragment = new PhotosFragment2();

            FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
            fragmentTransaction.replace(android.R.id.content, fragment);
            fragmentTransaction.commit();
        }
    });
            CustomGridSingle2 adapter2 = new CustomGridSingle2(myContext, mThumbIds2);
            GridView grid2 = (GridView)rootView.findViewById(R.id.gridView2);
            grid2.setFocusable(false);
            grid2.setAdapter(adapter2);
            grid2.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    Fragment fragment = new PhotosFragment2();

                    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
                    fragmentTransaction.replace(android.R.id.content, fragment);
                    fragmentTransaction.commit();
                }
            });

            return rootView;
        }


    }

PhotosFragment2.java

public class PhotosFragment2 extends Fragment {
    private FragmentActivity myContext;
    @Override
    public void onAttach(Activity activity) {
        myContext = (FragmentActivity) activity;
        super.onAttach(activity);
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        View rootView = inflater.inflate(R.layout.photos2, container, false);
        myContext.getActionBar().hide();
        return rootView;
    }
}

XML-файл

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <FrameLayout
        android:id="@+id/frame_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <LinearLayout
        android:id="@+id/left_drawer_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="@drawable/bgmenu"
        android:orientation="vertical">

        <RelativeLayout
            android:id="@+id/profilelayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0"
            android:paddingTop="10dp">


            <ImageView
                android:id="@+id/drawer_profile_image"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignBottom="@+id/drawer_profile_background"
                android:layout_alignLeft="@+id/drawer_profile_background"
                android:layout_alignRight="@+id/drawer_profile_background"
                android:layout_alignTop="@+id/drawer_profile_background"
                android:layout_marginBottom="7.667dp"
                android:layout_marginLeft="6.5dp"
                android:layout_marginRight="8.3dp"
                android:layout_marginTop="7.667dp"
                android:scaleType="centerCrop"></ImageView>


            <ImageView
                android:id="@+id/drawer_profile_background"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:scaleType="centerCrop"
                android:src="@drawable/profileblock">

            </ImageView>

            <ImageView
                android:id="@+id/settingicon"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignBottom="@+id/drawer_profile_background"
                android:layout_marginLeft="-15dp"
                android:layout_toRightOf="@+id/drawer_profile_background"
                android:background="@drawable/settings" />

            <textview
                android:id="@+id/username"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/drawer_profile_background"
                android:layout_centerHorizontal="true"
                android:layout_marginTop="5dp"
                android:text="Name"
                android:textAppearance="?android:attr/textAppearanceListItemSmall"
                android:textColor="@android:color/white" />


        </RelativeLayout>


        <ListView
            android:id="@+id/list_slidermenu"
            style="@style/buttonStyle"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_marginTop="30dp"
            android:layout_weight="2"
            android:cacheColorHint="@android:color/transparent"
            android:choiceMode="singleChoice"
            android:divider="@android:color/transparent"
            android:dividerHeight="1dp"
            android:listSelector="@android:color/transparent"
            android:scrollbars="none" />

    </LinearLayout>
</android.support.v4.widget.DrawerLayout>

13 ответов


при использовании fragmentTransaction.replace(R.id.container,fragment) он удалит все фрагменты, которые уже находятся в контейнере, и добавит новый в тот же контейнер.

теперь я могу предложить вам 2 вещи.Во-первых, если вы хотите использовать fragmentTransaction.replace(android.R.id.content, fragment); что вы делаете прямо сейчас, а затем не устанавливайте контент для вашего Activity используя setContentView.Тогда это должно сработать.Знать, что именно!--6--> вы можете обратиться этот вопрос и ответ stackoverflow

или во-вторых, в плане вашего Activity есть FrameLayout чей id content. А затем используйте

fragmentTransaction.replace(R.id.content, fragment);  
fragmentTransaction.addToBackStack(null);//add the transaction to the back stack so the user can navigate back
// Commit the transaction
fragmentTransaction.commit();  

надеюсь, что это помогает.

Подробнее:

из ваших комментариев кажется, что у вас возникли проблемы с получением идеи использования FrameLayout в своем Activityмакет(не любого из FragmentС макета).От документы

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

Итак, главная цель FrameLayout блокировать область, необходимую для установки наибольшего дочернего вида. Если вы используете FrameLayout as Fragment контейнер вы можете гарантировать, что у вас всегда есть свободное место для размещения самого большого Fragment'ы макет.

так что вы можете иметь свой FrameLayout что-то вроде этого в вашем ActivityXML-файл макета

<FrameLayout
    android:id="@+id/content"
    android:layout_height="match_parent"
    android:layout_width="match_parent">
 <!--you can put your existing views of your current xml here, so yes your entire xml is now inside this FrameLayout -->
</FrameLayout>

Я не использую getSupportFragmentManager(). Я использую getChildFragmentManager() и это сработало для меня. Можешь попробовать.


Если вы пытаетесь поставить Fragment на Fragment используйте getChildFragmentManager()


Если вы используете ViewPager, используйте getChildFragmentManager () для адаптера пейджера

viewPager.setAdapter(new ItemsAdapter(getChildFragmentManager()));

вы должны установить вид содержимого в вашей деятельности, что ваш PhotosFragment прилагается.

protected void onCreate(Bundle bundle) {
    super.onCreate(bundle);
    setContentView(R.layout.activity_main);

    //...
}

существует 2 наиболее распространенных причины этой проблемы

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

надеюсь, это поможет

Summved


Я знаю, что это очень поздно. Но это может сработать для других.

Я объявил идентификатор для каждого макета, например (3-я строка ниже)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"

С Android 4.2 (API 17) вложенные фрагменты становятся доступными. См.этой

для размещения фрагмента внутри другого фрагмента используйте getChildFragmentManager()

также доступно в библиотеке поддержки.


поместите этот блок кода в метод PhotosFragment2 onCreateView:

View rootView = inflater.inflate(R.layout.photos2, null);

вместо:

View rootView = inflater.inflate(R.layout.photos2, container, false);

в моем случае мне пришлось менять

ViewGroup root = (ViewGroup) inflater.inflate(R.layout.sample,
                container);

to

ViewGroup root = (ViewGroup) inflater.inflate(R.layout.sample,
                container, false);

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

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

проблема может быть в том, что вы добавляете фрагмент и beginTransaction в какой-то фрагмент, как

getFragmentManager().beginTransaction().replace(android.R.id.content, ImageBrowseFragment.newInstance(bundle),"ImageBrowseFragment")
            .addToBackStack(null).commit();

Я просто меняю getFragmentManager() to getActivity().getSupportFragmentManager()

тогда все идет хорошо

при добавлении фрагмента в фрагмент android.R.id.content или Window.ID_ANDROID_CONTENT, Я думаю, он представляет корневой контейнер вашего фрагмента, а не активность. Поэтому измените на getActivity().getSupportFragmentManager() его


у меня была такая же ошибка, и после многих попыток я обнаружил, что проблема была с "id" и "getActivity().getSupportFragmentManager ()".

прежде чем я реализую мне нравятся эти

txt_more.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    getChildFragmentManager()
                            .beginTransaction()
                            .replace(R.id.content_frame, new OpportunitiesFragment())
                            .commit();                }

            });

затем я перешел на эти

 txt_more.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
    ## Heading ##
                        getActivity().getSupportFragmentManager()
                                .beginTransaction()
                                .replace(android.R.id.content, new OpportunitiesFragment())
                                .commit();                }
                });