我有一个片段试图添加到视图中。

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中设置为Fragment布局的Fragment。
我正在使用FragmentActivity来托管持有feed_parser_layout的Fragment Layout。
我要对此进行编码正确在上方吗?

评论

可以包含XML吗?

在Activity中调用setContentView之前进行片段事务处理时,可能会遇到相同的错误

#1 楼

我也遇到了这个问题,直到我意识到我在FragmentActivity的setContentView()方法的onCreate()中指定了错误的布局。

传递给FragmentTransaction.add()的id(​​在您的情况下为R.id.feedContentContainer)必须是孩子setContentView()中指定的布局的一部分。

您没有向我们展示您的onCreate()方法,所以也许这是相同的问题。

评论


在setContentView中指定的布局子元素是什么意思?如何使它成为孩子?

– NinjaCoder
13年2月7日在15:51

如果在XML的父视图中声明了一个视图,则该视图是另一个视图的子视图。即。 RelativeLayout内部的TextView是RelativeLayout的子级。

– howettl
13年2月12日在19:06

@howettl:我知道这是旧的帖子。但我无法用您的答案解决此问题。这是一个问题:stackoverflow.com/questions/25844394/…-您能帮我吗?谢谢!

–TheDevMan
2014年9月16日下午2:18

@howettl,能否请您帮我解决类似问题。 stackoverflow.com/questions/26966623/…

–Vamsi Challa
2014年11月17日下午6:32

发生在我身上。 CTRL + C CTRL + V的缺点。

–0nyx
15年1月7日,19:11

#2 楼

当嵌套的片段并使用getSupportFragmentManager()而不是getChildFragmentManager()进行添加时,也会发生此错误。

评论


我的则相反。试图通过调用getChildFragmentManager()添加到主片段容器。指出这一点对我来说解决了。谢谢+1

– Speedynomads
2013年9月4日14:23在

@Malachiasz:您能否看一下有关ViewPager的问题?谢谢stackoverflow.com/questions/27937250/…

–Hoa Vu
2015年1月15日,2:13

这正是我的问题,谢谢。奇怪的是,这仅在调用.show()时横向发生。用它替换主要片段效果很好。

– cohenadair
2015年9月7日于20:05

那正是我的问题,非常感谢!它仅在某些慢速设备上发生,因此很难确切了解正在发生的事情。

– YawaraNes
16 Mar 10 '16 at 12:32

多次提出这个问题后,我觉得没有人遇到我的问题,只需要向下滚动一点即可。如果他们可以得到更具体的错误代码来说明可能是这样,那将是很好的。

– KodyVanRy
19-10-4在23:42

#3 楼

解决方案是从片段调用时使用getChildFragmentManager()

而不是getFragmentManager()

。如果要通过活动调用该方法,请使用getFragmentManager()

这将解决问题。

评论


@ surfer190使用getSupportFragmentManager()代替。

–阿米尔·侯赛因·加塞米(Amir Hossein Ghasemi)
16-5-22在11:08



更改为getChildFragmentManager(),这有效!

– Shyam
17年1月13日在10:45

在我的情况下,我使用的是底部页面片段中使用viewpager的片段导航。您的解决方案效果出色!! Thanx兄弟吨。

– Debasish Ghosh
17年11月17日在9:58

有同样的问题,这为我解决了! getChildFragmentManager()而不是getActivity()。getFragmentManager(),一旦我想到它,它就很有意义了:) TY!

–西蒙
18年2月3日在13:17



我正在从活动中调用该方法,但是现在不赞成使用getFragmentManager()!

– Alireza Noorali
5月7日10:13

#4 楼

我遇到了这个问题(在代码中构建UI时),这是由于我的ViewPager(显示Fragment)没有设置ID造成的,所以我只使用了pager.setID(id),然后它就起作用了。

这页面帮助我弄清楚了。

评论


使用viewPager时,我遇到了同样的问题。在执行事务之前,使用viewPager.setCurrentItem(n)修复了相同的错误。也许对某人有用。

–Kirk Hammett
2014年2月19日14:49

就我而言,方向相似,但问题是我在.setID中使用了负值。使用正整数可以解决此问题。

–伊格纳西奥(Ignacio Hagopian)
16-10-12在19:13

#5 楼

我遇到的另一种情况。
如果您使用嵌套片段,请在片段中说一个ViewPager,它的页面也是片段。

当您在内部片段(ViewPager的页面)中进行片段事务时,则需要

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


getActivity()是此处的关键。
...

评论


是的...对我来说,除此以外,其他所有实现都很好。我直接尝试访问如下代码:FragmentTransaction transaction = getSupportFragmentManager()。beginTransaction();然后,像您提到的那样,我分别使用getActivity()得到fragmentmanager。很不错

–anand krish
16-2-24在10:40



#6 楼

在我的情况下,我试图显示一个包含寻呼机的DialogFragment,当FragmentPagerAdapter尝试将Fragments添加到寻呼机时,抛出此异常。根据howettl的答案,我猜想这是由于Pager父级不是我的FragmentActivity中setContentView()中设置的视图。

我解决该问题的唯一更改是创建FragmentPagerAdapter传递在通过调用getChildFragmentManager()获得的FragmentMager中,而不是像我通常那样通过调用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;
    }
}


评论


不能从DialogFragment访问getChildFragmentManager()

–阿卜杜拉曼·沙图
13年7月18日在17:55

无障碍。这个解决了我的问题。谢谢

– DuhVir
12月8日下午16:42

#7 楼

如果您传递给FragmentTransaction.replace(int ID, fragment)的布局ID在其他正在膨胀的布局中存在,也会发生此异常。确保布局ID是唯一的,并且应该可以使用。

评论


如果ID不是唯一的,编译器不会报告ID是否在当前布局中丢失,因此,真正的问题不是ID的唯一性,而是当前布局中ID的遗漏。

–塞缪尔
16-09-13在4:46

#8 楼

当我遇到有关布局xml的问题时,我在与该线程相似的另一线程上读取了一个答案。

您的logcat说“找不到ID为0x7f080011的视图”。

打开gen->package->R.java->id,然后查找id 0x7f080011

当我遇到此问题时,此id属于我的FrameLayout文件中的activity_main.xml

FrameLayout没有ID(没有语句android:id = "blablabla")。

确保所有布局中的所有组件都具有ID,尤其是logcat中引用的组件。

评论


真好在带有LinuxOS的Android Studio中,它位于:/ home / bob / AndroidStudioWorkspace / HelloWorld / app / build / generated / source / r / release / android / support / v7 / appcompat。

–portsample
2015年5月5日20:17在

#9 楼

使用嵌套片段

通过使用getChildFragmentManager()而不是getActivity().getSupportFragmentManager()对我来说解决了崩溃问题


java.lang.IllegalArgumentException:找不到id的视图


评论


但是适配器内部无法导入getchildFragmentManager为什么

– Sunil Chaudhary
5月26日6:55

#10 楼

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 楼

我知道在一种情况下这已经可以解决,但是我的问题略有不同,我想分享一下,以防万一其他人穿鞋。

我正在onCreate()内进行交易,但是此时,视图树尚未膨胀,因此您会遇到相同的错误。将事务代码放入onResume()可使一切正常运行。

因此,只需确保您的事务代码在视图树膨胀后即可运行!

评论


嗯...就我而言,这样的代码在onCreate或onResume中都没有区别

– IgorGanapolsky
13年5月10日在20:54

在我的案例中,@ IgorGanapolsky也使用来自fragment的onAttach的回调解决了该问题。看我的答案

–亚历山大·马拉霍夫(Alexander Malakhov)
2015年5月5日在5:19



这正是我的问题。调用另一个类以刷新视图状态的操作是在尚未膨胀的布局上执行片段事务。在onResume()中调用它可以解决此问题。

– AWT
17年5月17日在16:09

在onResume()中,确保在super.onResume()之后进行任何使用FragmentManager的尝试。

–失败者
9月9日8:40

#12 楼

在Recycler View中使用Viewpager时遇到一个令人讨厌的错误。
在特殊情况下,我遇到一个错误。
我启动了一个片段,其中包含带有Viewpager的RecyclerView(使用FragmentStatePagerAdapter)。效果很好,直到我单击RecyclerView中的某个Cell切换到其他片段,然后使用Phone的硬件“后退”按钮导航回去,并且App崩溃。

有趣的是,我有两个Viewpagers相同的RecyclerView,两者都相距约5个单元格(其他在屏幕上不可见,它已掉下来)。因此,最初,我只是将解决方案应用于第一个Viewpager,而其余的都保持原样(使用分片的Viewpager)。

当第一个View pager可见时,向后导航可以很好地工作。现在,当我向下滚动到第二个,然后更改片段并返回时,它崩溃了(第一个发生了同样的事情)。因此,我必须同时更改两个Viewpagers。

无论如何,请阅读以下内容以找到有效的解决方案。
以下崩溃错误:

java.lang.IllegalArgumentException: No view found for id 0x7f0c0098 (com.kk:id/pagerDetailAndTips) for fragment ProductDetailsAndTipsFragment{189bcbce #0 id=0x7f0c0098}


花了几个小时调试它。阅读此完整的Thread帖子,直到应用所有解决方案,包括确保我通过childFragmentManager为止,直到一切从头开始。

没有任何帮助。

最后,我没有使用FragmentStatePagerAdapter,而是扩展了PagerAdapter和在Viewpager中使用它而不使用片段。我相信有些地方有嵌套片段的BUG。无论如何,我们都有选择。阅读...

下面的链接非常有用:

没有片段的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;
}


}

希望对您有帮助!

评论


是的,此解决方案有效,但是如果我需要使用自己的生命周期和变量(而不只是视图)进行困难的构造该怎么办?它将与带有播放和静音按钮的videoViews和imageViews一起使用。对我的情况没有帮助吗?

– Nikita Axyonov
16年7月19日在15:34

我相信这是原因:stackoverflow.com/a/27966053/1377819

– Hoang Nguyen Huu
19-09-17在7:50

#13 楼

我有同样的问题,但是我的问题发生在方向改变上。其他解决方案均无效。因此事实证明,当基于屏幕大小进行两个或一个窗格布局时,我忘记从片段中删除setRetainInstance(true);

评论


如果您位于嵌套片段中,请将您的setRetainInstance(true)设置为false,这将修复错误。

–ralphgabb
2014年11月13日在2:34

#14 楼

以防万一有人犯了我犯的同样愚蠢的错误;检查您是否没有在某处覆盖活动内容(即寻找对setContentView的其他调用)

在我的情况下,由于粗心的复制和粘贴,我在片段中使用了DataBindingUtil.setContentView而不是DataBindingUtil.inflate,它弄乱了活动的状态。

评论


我们怎么能犯同样的愚蠢的复制和粘贴错误?那正是我的问题。谢谢

– Alberto M
6月29日7:46

#15 楼

我的错误是在FragamentTransaction上。

我正在执行此t.replace(R.layout.mylayout);而不是t.replace(R.id.mylayout);

,不同之处在于一个是布局,另一个是对layout(id)的引用

#16 楼

我遇到了同样的问题,让我发布我的代码,以便大家都可以看到它,而不是做与我相同的事情。

@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之前设置片段。哎呀

评论


谢谢!我在做同样的事情,所以我将setContentView放在onBuildHeaders中

–兰迪
2012-12-25 14:21

#17 楼

该页面似乎是发布有关Fragment IllegalArgumentException的建议的好中心位置。这是您可以尝试的另一件事。这终于对我有用:

我忘了我有一个单独的布局文件以横向显示。在我也添加了FrameLayout容器之后,该片段也起作用了。


另外,如果您已经尝试过此页面上建议的所有其他内容(以及整个Internet),并且已经将您的头发拉了好几个小时,请考虑将这些令人讨厌的片段丢掉,然后再回到旧的标准布局中。 (实际上,这就是我终于发现问题时要做的事情。)您仍然可以使用容器概念。但是,除了使用片段填充之外,还可以使用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布局文件的名称。有关更多信息,请参见通过include重新使用布局。

评论


这是一个很好的建议,但是如果需要动态切换片段,则此方法无效。另外,它还降低了可重用性,因为您可以将行为(代码)封装在片段中。

–亚历山大·马拉霍夫(Alexander Malakhov)
2015年5月5日4:30



我绝对同意。碎片要好得多。

– Suragch
2015年3月5日,9:15

#18 楼

以我为例,我在回收站视图项中有一个SupportMapFragment(我使用的是开销较低的“ liteMode”,这使地图看起来像是非交互式的,几乎像静态图像一样)。我使用的是正确的FragmentManager,并且一切似乎都可以正常工作。一旦项目列表超出了屏幕高度,然后滚动时便开始出现此问题。

原来,这是因为我在视图内注入了动态SupportMapFragment,该视图位于另一个片段内,以解决尝试在XML中静态声明它时遇到的一些问题。因此,仅当视图附加到窗口(即在屏幕上可见)后,片段占位符布局才能替换为实际的片段。因此,我把代码初始化了SupportMapFragment,进行了Fragment替换,并在onAttachedToWindow事件中调用了getMapAsync()。

我忘记做的是确保我的代码没有运行两次。即在onAttachedToWindow事件中,在尝试创建动态SupportMapFragment的新实例并执行Fragment替换之前,请检查我的动态SupportMapFragment是否仍然为null。当该项目脱离RecyclerView顶部时,它将与窗口分离,然后在滚动回该项目时重新附加,因此会多次触发此事件。

一旦我添加了null检查,每个RecyclerView项目仅发生一次,问题就消失了! TL; DR!

#19 楼

当您从另一个片段中的一个片段调用时,会发生这种情况。

使用:

getActivity().getSupportFragmentManager().beginTransaction();


#20 楼

我已修复此错误,我使用commitNow()替换了commit()

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


commitNow是同步方法,commit()方法是异步方法。

#21 楼

当我尝试用onCreateView()中的片段替换view时遇到了这个问题。像这样:

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();

    }



您必须在onCreateView()中返回一个视图,以便以后可以替换它
您可以对此进行任何操作查看片段举升周期中的以下功能,例如onActivityCreated()


希望有帮助!

#22 楼

在我的情况下,当我为同一个布局元素(片段占位符)使用不同的ID,同时为不同的Build Variants使用多个ID时,抛出此异常。出于某种原因,当您第一次替换片段时,它工作得很好,但是如果您再次尝试执行此操作,则会出现此异常。
因此,如果您有多个布局用于不同布局,请确保使用相同的ID。构建变体。

#23 楼

当您不将<include layout="@layout/your_fragment_layout"/>放入app_bar_main.xml中时,也会发生此问题

#24 楼

如果要用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);


#25 楼

在创建活动时执行片段事务时,我遇到了同样的问题。

核心问题是尼克已经指出的-视图树尚未膨胀。但是他的解决方案不起作用-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();
    }

    //...
}


#26 楼

就我而言,我正在使用一个片段类文件来声明一个listview适配器类。
我为公共适配器类使用了一个不同的文件,错误消失了。

#27 楼

当您在两个具有相同ID的片段中有两个视图时,也会发生这种情况

评论


这是不正确的。在这种情况下,代码甚至无法编译。

– Taslim Oseni
19-09-26在11:29

#28 楼

我遇到了同样的问题,因为我试图在将容器布局添加到活动之前添加片段。

#29 楼

有时是因为您使用的是BottomNavigationView。如果您从导航中打开一个Intent,然后在该活动中打开一个片段,说

transaction.replace(R.id.container,new YourFragment());


,那么该活动将无法找到您所需要的导航方法

解决方案:将活动更改为片段并使用app中的addOnBackStack处理导航。如果您已经实现了Jetpack导航,则只需在项目中使用片段即可。

#30 楼

就我而言。我有一个带有服务器ActivityFragment
有时我需要重新创建Fragment s,当
语言更改时
片段布局有些不需要一些或内容更改需要重新创建
其他更改

我在活动中清除了所有Fragment并将其全部设置为null
,但是Fragment已经创建了它自己,而它的宿主活动
是bean设置为null,因此在调用Fragment view
将其检查为空

例如

Activity{
    fragment
    recreate{
       fragment = null then new instance
    }

}

Fragment{
    if((activity).fragment != null) {
       findViewById()
    }

}