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

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的片段布局。 我上面写的对吗?


当前回答

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

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

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

其他回答

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

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

    //...
}

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

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

使用导航库,当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"/>

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

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

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

解决方案:将活动更改为片段,并在应用程序中使用addOnBackStack处理导航。如果你已经实现了Jetpack导航,只需在项目中使用片段。

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