【问题标题】:java.lang.IllegalArgumentException: No view found for id 0x1020002 (android:id/content) for fragmentjava.lang.IllegalArgumentException:没有为片段的 id 0x1020002 (android:id/content) 找到视图
【发布时间】:2014-10-29 05:06:22
【问题描述】:

我正在尝试从一个片段移动到另一个片段。它在片段事务期间显示以下错误-

    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>

【问题讨论】:

  • fragmentTransaction.replace(R.id.content, fragment);
  • @AlexanderZhak 显示无法解析符号 R.id.content 如果我将 android.R.id.content 更改为 R.id.content
  • id content 应该在您的活动中使用的 xml 资源中定义。如何正确初始化片段请参考developer.android.com/guide/components/fragments.html。 android.R 是一个内部系统ID
  • @AlexanderZhak 我的活动由许多片段组成,我在其他片段中使用了片段事务,这也工作正常......只有在这两个片段中它不起作用......
  • @AlexanderZhak 检查上面更新的整个 logcat 错误

标签: android fragmenttransaction


【解决方案1】:

当您使用fragmentTransaction.replace(R.id.container,fragment) 时,它将删除容器中已经存在的所有片段,并将您的新片段添加到同一个容器中。

现在我可以建议你两件事。首先,如果你想使用你现在正在做的fragmentTransaction.replace(android.R.id.content, fragment);,那么不要使用setContentView 为你的Activity 设置内容。这应该可以正常工作。想知道android.R.id.content到底是什么,你可以参考this stackoverflow question and answer

或者其次,在您的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();  

希望这会有所帮助。

更多信息:

从您的 cmets 看来,您在获得在 Activity 的布局中使用 FrameLayout 的想法时遇到了一些问题(不是任何 Fragment 的布局)。来自 Documents

FrameLayout 的设计目的是在屏幕上屏蔽一个区域以显示单个项目。通常,应该使用 FrameLayout 来保存单个子视图,因为很难以一种可缩放到不同屏幕尺寸而又不相互重叠的方式来组织子视图。

所以FrameLayout的主要目的是为了遮挡住需要容纳最大子view的区域。如果您将FrameLayout 用作Fragment 容器,则可以确保始终有可用空间来容纳最大的Fragment 布局。

所以您可以在您的Activity 的布局 xml 文件中包含您的 FrameLayout 类似的内容

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

【讨论】:

  • 我在上面发布的 java 类都是片段。我是否需要更改其中的任何内容或问题是由于调用这些片段的活动引起的?
  • 你能建议我在 id 为 content 的 FrameLayout 的活动中添加哪些代码吗?
  • 那么你需要在这里发布你的Activity。需要看看你现在在你的Activity中写了什么代码。你可以有一个类似的Activity,你现在有.Just 在布局 xml 文件中添加 FrameLayout 并在替换 Fragment 时使用 fragmentTransaction.replace(R.id.content, fragment);
  • 我认为您的Fragment 没有任何问题。这是您的Activity 及其布局xml。如果你真的不想为你的Activity 设置任何内容,那么你不必在Activity 中写setContentView。你可以简单地离开那行。然后你可以使用fragmentTransaction.replace(android.R.id.content, fragment);
  • 我应该在哪个布局中添加 FrameLayout?Activity 布局还是 PhotosFragment 布局?我之前没有使用过 FrameLayout..我应该将整个 xml 文件放在 FrameLayout 中吗?
【解决方案2】:

我不使用getSupportFragmentManager()。 我使用getChildFragmentManager(),它对我有用。 你可以试试看。

【讨论】:

  • getChildFragmentManager() 不支持 v4 或 v13 ...如果您使用的是 v4 或 13 ...您是如何管理它的?
【解决方案3】:

如果您尝试将Fragment 放入Fragment,请使用getChildFragmentManager()

【讨论】:

  • tnx 节省了我的时间。但是你能解释一下我们什么时候应该使用 Childfragmentmanager() 和 Supportfragmentmanager()。
  • @Rojesh,据我了解,当您将 Fragment 放入 Activiti(来自支持库)时,您必须使用 supportFragmentManager,但不能放入 Activity 中的其他 Fragment
【解决方案4】:

如果您使用 ViewPager,请使用 getChildFragmentManager() 作为寻呼机适配器

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

【讨论】:

  • 哦,哇,得票最少的答案解决了我的问题!谢谢!
【解决方案5】:

您必须在 Activity 中设置附加 PhotosFragment 的内容视图。

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

    //...
}

【讨论】:

    【解决方案6】:

    这个问题有两个最常见的原因

    1. 在 onCreate() 方法的 setContentView() 中指定了错误的布局
    2. 嵌套 Fragment 并使用 getSupportFragmentManager() 而不是 getChildFragmentManager() 添加它们时也会发生错误

    希望这会有所帮助

    求和

    【讨论】:

    • 对于片段中的片段,使用getFragmentManager() v4 适用于replace backstack 按下返回按钮。谢谢
    • 我在直接使用 getFragmentManager() 时遇到了问题,所以我尝试使用 getActivity().getSupportFragmentManager();这很好用。希望这是有道理的
    • 你保存了我的 *ss。谢谢。
    【解决方案7】:

    我知道这已经很晚了。但它可能适用于其他人。

    我为每个布局声明了 id,比如(下面的第 3 行)

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

    【讨论】:

      【解决方案8】:

      自从 Android 4.2 (API 17) 嵌套片段变得可用。 见this

      要将片段放置在其他片段中,请使用getChildFragmentManager()

      也可在支持库中找到。

      【讨论】:

        【解决方案9】:

        我遇到了同样的错误,在尝试了很多事情后,我发现问题出在“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();                }
                        });
        

        【讨论】:

          【解决方案10】:

          把这段代码放在 PhotosFragment2 的 onCreateView 方法中:

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

          代替:

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

          【讨论】:

          • 您是否更改了 PhotosFragment 和 PhotosFragment2 中的相同代码块?尝试改变它。
          • 是的,我改变了两个相同的输出
          【解决方案11】:

          就我而言,我必须改变

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

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

          【讨论】:

            【解决方案12】:

            这个答案突出了一个可能发生的愚蠢错误,即嵌套片段或将活动转换为片段时出现的错误。

            如果您尝试用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);
            

            【讨论】:

              【解决方案13】:

              问题可能是你在一些片段中添加了一个片段并开始事务,比如

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

              我只是把getFragmentManager()改成getActivity().getSupportFragmentManager()

              然后一切顺利

              当您在片段中添加片段时使用android.R.id.contentWindow.ID_ANDROID_CONTENT,我猜它代表您的片段的根容器而不是活动。所以改成getActivity().getSupportFragmentManager()就行了

              【讨论】:

                【解决方案14】:

                如果您将ViewPager 与片段(页面)一起使用并尝试显示一个新片段来自页面,您将收到此错误。我认为,您不能从ViewPager 的页面引用Activity 的容器。

                在这种情况下,您应该致电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")
                    }
                }
                

                【讨论】:

                  【解决方案15】:

                  确保您调用的片段 id 在 onCreate 方法的 setcontent 中列出的类中。就我而言,我正在将布局从线性编辑为约束。为了不弄乱工作代码,我制作了另一个布局,但在此过程中弄乱了一个 id,因此 oncreate 上的内容是编辑后的布局,但被调用的片段来自旧布局。显然,在新布局中,我给了它一个不同的 id 名称。使用 ctrl+shift+f 搜索片段的 id 并查看搜索结果是否指向您在 oncreate 方法中指定的布局。祝你好运。

                  【讨论】:

                    【解决方案16】:

                    可能发生的最常见错误是,如果您有多个版本的 XML 布局(比如 v21 和 v23)并且您仅在较低版本的 XML 中添加了&lt;fragment&gt; 标签(反之亦然)。 所以,请检查您在两个版本中添加了&lt;fragment&gt; 标签(或pageGroup 等)。

                    【讨论】:

                    • 标签,我的意思是你的片段必须添加的片段标签。
                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-04-17
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多