Android碎片没有视图找到ID?

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

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.
我上面写的对吗?< / p >

339907 次浏览

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

传入FragmentTransaction.add()的id,在你的例子中是R.id.feedContentContainer,必须是setContentView()中指定的布局的子元素。

你没有向我们展示你的onCreate()方法,所以这可能是同样的问题。

我知道这个问题已经在一种情况下得到了解决,但我的问题略有不同,我想我应该分享一下,以防其他人处于我的处境。

我在onCreate()内做了一个事务,但在这一点上,视图树还没有膨胀,所以你得到了同样的错误。将事务代码放在onResume()中可以使一切正常运行。

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

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

这个页面帮助我解决了这个问题。

如果你传递给FragmentTransaction.replace(int ID, fragment)的布局ID存在于其他正在膨胀的布局中,也会发生这种异常。确保布局ID是唯一的,它应该工作。

我也有同样的问题,让我把我的代码贴出来让你们都能看到,不要做和我一样的事情。

@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之前设置了片段。糟糕。

在我的情况下,我试图显示一个包含页导航的DialogFragment,当FragmentPagerAdapter试图将片段添加到页导航时,这个异常被抛出。根据howettl的回答,我猜这是由于寻页器的父母不是在setContentView()在我的FragmentActivity的视图设置。

我唯一做的改变来解决这个问题是创建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;
}
}

我在另一个线程上读到的答案与此类似,当我遇到这个问题时,它涉及到布局xml。

你的日志显示“没有为id 0x7f080011找到视图”。

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

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

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

确保所有布局中的所有组件都有id,特别是logcat中引用的组件。

当有嵌套的碎片并使用getSupportFragmentManager()而不是getChildFragmentManager()添加它们时,也会发生此错误。

我的错误在FragamentTransaction上。

我正在做这个t.replace(R.layout.mylayout);而不是t.replace(R.id.mylayout);

区别在于一个是布局,另一个是layout(id)的引用

我也有同样的问题,但我的问题发生在取向改变上。其他的解决方案都不起作用。因此,当基于屏幕大小进行两个或一个窗格布局时,我忘记从我的片段中删除setRetainInstance(true);

当我试图用onCreateView()中的片段替换视图时,遇到了这个问题。是这样的:

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


}
  1. 你必须在onCreateView()中返回一个视图,以便以后可以替换它
  2. 你可以在片段提升循环中的以下函数中对该视图进行任何操作,如onActivityCreated()

希望这能有所帮助!

这个页面似乎是发布关于片段IllegalArgumentException的建议的一个很好的中心位置。还有一件事你可以试试。这是最后对我有用的方法:

我忘了我有一个单独的横向布局文件。在我添加了我的FrameLayout容器之后,这个片段也工作了。


另外,如果你已经尝试了本页(以及整个互联网)上建议的所有方法,并且已经拔了几个小时的头发,考虑丢弃这些烦人的片段,回到一个好的旧标准布局。(当我最终发现我的问题时,这实际上就是我在做的事情。)您仍然可以使用容器的概念。然而,你可以使用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重用布局

解决方案是使用getChildFragmentManager()

而不是getFragmentManager()

当从片段调用时。如果从活动调用方法,则使用getFragmentManager()

这样问题就解决了。

如果你试图用fragmentManager替换片段中的片段,但你是不膨胀父片段,这可能会导致一个问题。

BaseFragment.java OnCreateView中:

if (savedInstanceState == null) {
getFragmentManager().beginTransaction()
.replace(R.id.container, new DifferentFragment())
.commit();
}


return super.onCreateView(inflater, container, savedInstanceState);
< p >取代super.onCreateView(inflater, container, savedInstanceState); 使用膨胀片段的正确布局:

        return inflater.inflate(R.layout.base_fragment, container, false);

我有同样的问题,当做片段事务,而活动创建。

核心问题是尼克已经指出来了视图树还没有被膨胀。但是他的解决方案并没有起作用——在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();
}


//...
}

当我从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>

所以布局必须有一个子视图。我猜他们在新图书馆里强制这么做了。

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

当你在内部片段(ViewPager的页面)中进行Fragment事务处理时,你将需要

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

getActivity()是这里的关键。 …< / p >

我在回收器视图中使用Viewpager时面临一个严重的错误。 下面是我在特殊情况下遇到的错误。 我开始了一个片段,它有一个RecyclerView与Viewpager(使用FragmentStatePagerAdapter)。它工作得很好,直到我在RecyclerView中点击一个单元格切换到不同的片段,然后使用手机的硬件返回按钮导航回来,应用程序崩溃了

有趣的是,我在同一个RecyclerView中有两个Viewpagers,它们都是大约5个单元格的距离(另一个在屏幕上不可见,它已经关闭了)。所以最初我只是应用了第一个Viewpager的解决方案,并留下了另一个,因为它是(Viewpager使用片段)。

当第一个查看分页器可见时,返回导航工作正常。现在,当我向下滚动到第二个,然后改变片段,回来,它崩溃了(同样的事情发生在第一个)。所以我不得不改变两个Viewpagers。

无论如何,阅读下面的内容来找到工作解决方案。 崩溃错误如下:

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

花了几个小时调试它。阅读这篇完整的帖子,直到底部应用所有的解决方案,包括确保我传递childFragmentManager。

毫无效果。

最后,我没有使用FragmentStatePagerAdapter,而是扩展了PagerAdapter,并在Viewpager中使用它,而不使用片段。我相信某些地方存在嵌套片段的BUG。不管怎样,我们有选择。读……

下面的链接非常有用:

Viewpager Without Fragments

链接可能会死,所以我在这里张贴我实现的解决方案如下:

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

希望这对你有帮助!!

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

在我的例子中,我在回收器视图项中有一个SupportMapFragment(我使用了较低开销的“liteMode”,它使地图看起来是非交互式的,几乎像一个静态图像)。我使用了正确的FragmentManager,一切看起来都很正常……用一个小列表。当项目列表超过屏幕高度时,我在滚动时开始遇到这个问题。

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

我忘记做的是确保我的代码不会运行两次。例如,在onAttachedToWindow事件中,在尝试创建它的新实例并进行片段替换之前,检查我的动态SupportMapFragment是否仍然为空。当项目离开RecyclerView顶部时,它将从窗口中分离,然后当您回滚到它时重新连接,因此此事件将触发多次。

一旦我添加了空检查,它只发生一次每个RecyclerView项目和问题消失了!TL;博士!

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

使用:

getActivity().getSupportFragmentManager().beginTransaction();
在我的情况下,这个异常被抛出时,我使用不同的id为相同的布局元素(片段占位符),而有几个不同的构建变体。出于某种原因,当你第一次替换fragment时它工作得很好,但如果你尝试再做一次,你会得到这个异常。 因此,如果你有不同的构建变体的多个布局,请确保你使用相同的id

嵌套的碎片

对于我来说,使用getChildFragmentManager()而不是getActivity().getSupportFragmentManager()解决了崩溃

java.lang.IllegalArgumentException: id没有视图

我修复了这个错误,我使用commitNow()替换commit()

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

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

以防有人和我犯同样愚蠢的错误;检查你没有覆盖活动内容的某处(即寻找额外的调用setContentView)

在我的例子中,由于粗心的复制和粘贴,我使用了DataBindingUtil。setContentView在我的片段,而不是DataBindingUtil。膨胀,这会打乱活动的状态。

当你没有在你的app_bar_main.xml中放入<include layout="@layout/your_fragment_layout"/>时,这个问题也会发生

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

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

有时是因为你在使用一个BottomNavigationView。如果你从导航中打开Intent,在那个活动中打开一个片段

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

那么Activity将无法找到你正在使用的导航方法。

解决方案:改变活动片段和处理导航与addOnBackStack在你的应用程序。如果你已经实现了Jetpack导航只使用片段在你的项目。

在我的情况下。我有一个Activity和几个__abc1 有时我需要在
时重新创建Fragments

  • 语言就是变化
  • 片段布局有的需要有的不需要或者内容变更需要重新创建
  • 其他变化李< / >

    我清除所有__abc0,并将所有设置为活动中的null 但是Fragment已经创建了自己,当它承载活动时 是bean集空,所以之前调用片段视图 检查它为null

    例如

    Activity{
    fragment
    recreate{
    fragment = null then new instance
    }
    
    
    }
    
    
    Fragment{
    if((activity).fragment != null) {
    findViewById()
    }
    
    
    }
    
  • 对于导航库,当NavHostFragment没有id时,问题就会出现。

    错误的声明:

    <fragment
    android:name="androidx.navigation.fragment.NavHostFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:navGraph="@navigation/myGraph"/>
    

    正确的声明:

    <fragment
    android:id="@+id/myId"
    android:name="androidx.navigation.fragment.NavHostFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:navGraph="@navigation/myGraph"/>
    

    在我们的例子中,我们已经清除/损坏了class.dex文件以及gradle编译的输出。由于缓存重新编译没有尝试,因此没有错误,但apk没有所需的文件,导致这个令人困惑的错误。一个gradle resync和新的构建清除了我们所有的错误。

    //快乐编码

    使用childFragmentManager代替activity!

    我也得到了同样的错误,然后,我意识到问题是。add(R.id.CONTAINERNAME)所以基本上我给了id = CONTAINERNAME在错误的xml .. 因此,解决方案是首先检查你已经给出了id = CONTAINERNAME在xml中,你想要显示的片段。 还要注意,我试图调用片段形式的活动.. 我希望这个小错误能解决问题

    参考2020年最新版本的android

    我在我的项目中使用视图绑定,并且不注意在膨胀ActivityHelloWorldBinding类后添加setContentView():

    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityHelloWorldBinding.inflate(layoutInflater)
    
    
    // Add this line.
    setContentView(binding.root)
    }
    

    有点晚了,但可能会对某人有所帮助:

    我正在重写 onCreate (savedInstanceState:包?, persistentState: PersistableBundle? (自动完成首先建议这个,我在这里添加了setContentView())

    请确保重写正确的: onCreate (savedInstanceState:包?)< / >强

    在我的情况下,我使用了一个通用的片段持有人使用我的活动类,我在运行时用适当的片段替换这个通用片段。

    问题是我给id的包括和generic_fragment_layout,从包括删除id解决了它。

    正如https://stackoverflow.com/users/2075875/malachiasz所说

    这个解决方案实际上是可行的

    getChildFragmentManager().beginTransaction().replace(R.id.cpu_bottomNav_frame,new fragment()).commit();
    

    只需添加viewPager。setOffscreenPageLimit(页面数量);

    我有这个问题。在我的情况下,我忘记在我的Xml文件中添加框架布局,添加框架布局后,我的问题已经解决了。

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