Android Fragment没有找到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中设置为Fragment布局的Fragment。
我使用FragmentActivity来托管持有feed_parser_layout的片段布局。
我上面的编码正确吗?

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

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

你没有给我们展示你的onCreate()方法,所以也许这是同样的问题。

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

解决方案是使用getChildFragmentManager()

代替getFragmentManager()

从片段调用时。如果你是从一个活动中调用这个方法,那么使用getFragmentManager()

这样问题就解决了。

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

当你在内部片段(ViewPager的页面)中做片段事务时,你需要

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

getActivity()是这里的关键。…

我有这个问题(在代码中构建我的UI时),这是由我的ViewPager(显示Fragment s)没有ID集引起的,所以我简单地使用pager.setID(id),然后它工作。

这一页帮我弄明白了。

在我的情况下,我试图显示一个包含寻呼机的DialogFragment,当FragmentPagerAdapter试图将Fragments添加到寻呼机时抛出此异常。基于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;
    }
}

With 嵌套片段

为我使用 getChildFragmentManager() 代替getActivity().getSupportFragmentManager()解决崩溃

. lang。没有找到id

的视图

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

我在另一个类似的帖子上读到的答案,当我遇到这个问题时,它为我工作,涉及布局xml。

你的日志显示"没有找到id 0x7f080011的视图"

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

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

框架布局没有ID(没有android:id = "blablabla"语句)。

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

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

所以布局必须有子视图。我猜他们是在新图书馆强制执行的。

我知道有一种情况已经回答了这个问题,但我的问题略有不同,我想我应该分享一下,以防有人和我一样。

我正在onCreate()内进行交易,但此时视图树尚未膨胀,因此您会得到相同的错误。把交易代码放在onResume()中,一切都运行得很好。

所以只要确保你的事务代码在视图树膨胀之后运行就可以了!

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

有趣的是,我在同一个RecyclerView中有两个Viewpagers,两个都是大约5个单元格(其他在屏幕上不可见,它是下来的)。因此,最初我只是将解决方案应用于第一个Viewpager,并保留其他的(Viewpager使用Fragments)。

当第一个视图页可见时,导航返回工作正常。现在,当我向下滚动到第二个,然后改变片段,回来,它崩溃了(同样的事情发生与第一个)。所以我必须改变这两个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;
}

}

希望这是有帮助的!

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

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

我有同样的问题,但我的问题是发生在方向变化。其他的解决方案都不起作用。所以事实证明,我忘记删除setRetainInstance(true);从我的片段,当做一个基于屏幕大小的两个或一个窗格布局。

我的错误是在FragamentTransaction上。

我做的是t.replace(R.layout.mylayout);而不是t.replace(R.id.mylayout);

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

这发生在你从另一个片段内调用时。

use:

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

我也有同样的问题,让我把我的代码贴出来,这样你就可以看到它,而不是像我一样做同样的事情。

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

这个页面似乎是一个很好的中心位置张贴关于Fragment 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布局文件的名称。有关更多信息,请参见重用包含布局。

我修复了这个bug,我用commitNow()代替commit()

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

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

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

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

在我的例子中,我在一个回收器视图项中有一个SupportMapFragment(我使用较低开销的"liteMode",它使地图显示为非交互式的,几乎像一个静态图像)。我正在使用正确的FragmentManager,一切似乎都工作得很好……有一个小列表。一旦项目列表超过屏幕高度一点,我就开始在滚动时遇到这个问题。

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

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

一旦我添加了null检查,它只在每个RecyclerView项中发生一次,问题就消失了!TL;博士!

这个问题也发生在你不把<include layout="@layout/your_fragment_layout"/>在你的app_bar_main.xml

使用childFragmentManager而不是活动!!supportFragmentManager

当我试图用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}

然后我修复了这个问题,把替换到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()

希望这对你有帮助!

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

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

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

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

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

核心问题是尼克已经指出的——视图树还没有膨胀。但他的解决方案没有工作-同样的例外在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();
    }
    //...
}

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

当你在两个片段中有两个具有相同id的视图

最新更新