it-swarm.com.ru

java.lang.IllegalArgumentException: не найдено представление для идентификатора 0x1020002 (Android: идентификатор/содержимое) для фрагмента

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

    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$1.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>
30
Android Developer

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

Теперь я могу предложить вам 2 вещи. Во-первых, если вы хотите использовать функцию fragmentTransaction.replace(Android.R.id.content, fragment);, которую вы делаете прямо сейчас, то не устанавливайте содержимое для своей Activity, используя setContentView. Тогда это должно работать нормально. Чтобы знать, что именно Android.R.id.content вы можете использовать этот вопрос и ответ на стекопоток

Или, во-вторых, в макете вашей Activity есть FrameLayout с идентификатором 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). Из Documents

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

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

Таким образом, вы можете иметь свой FrameLayout что-то вроде этого в xml-файле макета Activity

<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>
26
Sash_KP

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

19
NhatVM

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

14
Andrei Tr.

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

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

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

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

    //...
}
4
John Cordeiro

Есть 2 наиболее распространенные причины этой проблемы

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

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

Summved

3
Summved Jain

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

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

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

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

Чтобы разместить фрагмент внутри другого фрагмента, используйте getChildFragmentManager()

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

1
Akbar

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

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

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

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

Когда вы добавляете фрагмент во фрагмент, используйте Android.R.id.content или Window.ID_Android_CONTENT, я думаю, он представляет корневой контейнер вашего фрагмента, а не активность. Так что измените на getActivity().getSupportFragmentManager() работает

0
Bruce too

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

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

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

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

вместо:

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

У меня была та же ошибка, и после попытки многих вещей я обнаружил, что проблема была с «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();                }
                });
0
pavithra

в моем случае я должен был изменить

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

в

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

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

В этом случае вам следует вызвать getActivity(). Затем в Activity напишите метод, который откроет новый фрагмент.

class YourActivity : AppCompatActivity() {

    fun showNewFragment(title: String) {
        val fm = supportFragmentManager
        fm?.beginTransaction()?.apply {
            val fragment = NewFragment.newInstance(title)
            replace(R.id.container, fragment, NewFragment.TAG)
            addToBackStack(null)
        }?.commit()
    }
}

class PageFragment : Fragment() {

    private fun show() {
        (activity as YourActivity).showNewFragment("New fragment")
    }
}    

Если вы вызовете getParentFragment() и добавите новый фрагмент, то вы поместите новый фрагмент в ViewPager:

class ViewPagerFragment : Fragment() {

    fun showNewFragment(title: String) {
        val fm = childFragmentManager
        fm?.beginTransaction()?.apply {
            val fragment = NewFragment.newInstance(title)
            replace(R.id.container, fragment, NewFragment.TAG)
            addToBackStack(null)
        }?.commit()
    }
}

class PageFragment : Fragment() {

    private fun show() {
        (parentFragment as? ViewPagerFragment)?.showNewFragment("New fragment")
    }
}
0
CoolMind