我有一个片段要添加到视图中。
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 布局。
我上面的编码是否正确?
我也遇到了这个问题,直到我意识到我在 FragmentActivity 的 onCreate()
方法的 setContentView()
中指定了错误的布局。
传递给 FragmentTransaction.add()
的 ID(在您的情况下为 R.id.feedContentContainer
)必须是 setContentView()
中指定的布局的子级。
您没有向我们展示您的 onCreate()
方法,所以也许这是同一个问题。
当嵌套 Fragment 并使用 getSupportFragmentManager() 而不是 getChildFragmentManager() 添加它们时,也会发生此错误。
解决方案是使用 getChildFragmentManager()
而不是 getFragmentManager()
从片段调用时。如果您从 Activity 调用该方法,请使用 getFragmentManager()
。
这将解决问题。
getSupportFragmentManager()
。
我遇到的另一种情况。如果您使用嵌套片段,请说片段中的 ViewPager,其页面也是片段。
当您在内部片段(ViewPager 的页面)中进行片段事务时,您将需要
FragmentManager fragmentManager = getActivity().getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
getActivity() 是这里的关键。 ...
我遇到了这个问题(在代码中构建我的 UI 时),它是由我的 ViewPager
(显示 Fragment
)没有设置 ID 引起的,所以我只是使用了 pager.setID(id)
,然后它就起作用了。
This page 帮助我解决了这个问题。
在我的情况下,我试图显示一个包含寻呼机的 DialogFragment,并且当 FragmentPagerAdapter 尝试将片段添加到寻呼机时引发了此异常。根据 howettl 的回答,我猜这是由于 Pager 父级不是我的 FragmentActivity 中 setContentView() 中设置的视图。
我为解决该问题所做的唯一更改是创建传递通过调用 getChildFragmentManager() 获得的 FragmentMager 的 FragmentPagerAdapter,而不是像通常那样通过调用 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;
}
}
如果您传递给 FragmentTransaction.replace(int ID, fragment)
的布局 ID 存在于其他正在膨胀的布局中,也会发生此异常。确保布局 ID 是唯一的并且它应该可以工作。
使用嵌套片段
对我来说,使用 getChildFragmentManager()
而不是 getActivity().getSupportFragmentManager()
解决了崩溃
java.lang.IllegalArgumentException:没有为 id 找到视图
当我遇到这个问题时,我在另一个类似于这个对我有用的线程上阅读的答案涉及布局 xml。
您的 logcat 显示“未找到 id 0x7f080011 的视图”。
打开 gen->package->R.java->id
,然后查找 ID 0x7f080011
。
当我遇到此问题时,此 ID 属于我的 activity_main.xml
文件中的 FrameLayout
。
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()
使一切运行良好。
因此,只需确保您的事务代码在视图树膨胀后运行!
onAttach
的回调解决了这个问题。查看我的answer
在 Recycler View 中使用 Viewpager 时,我遇到了一个令人讨厌的错误。下面是我在特殊情况下遇到的错误。我开始了一个片段,它有一个带有 Viewpager 的 RecyclerView(使用 FragmentStatePagerAdapter)。它运行良好,直到我在 RecyclerView 中单击单元格时切换到不同的片段,然后使用手机的硬件后退按钮导航回来,应用程序崩溃了。
有趣的是,我在同一个 RecyclerView 中有两个 Viewpager,并且两个 Viewpager 都相距大约 5 个单元格(其他在屏幕上不可见,它已关闭)。所以最初我只是将解决方案应用于第一个 Viewpager 并保留另一个原样(Viewpager using Fragments)。
当第一个视图寻呼机可见时,向后导航工作正常。现在,当我向下滚动到第二个然后更改片段并返回时,它崩溃了(第一个也发生了同样的事情)。所以我不得不改变两个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。无论如何,我们有选择。读 ...
下面的链接非常有帮助:
链接可能会死,所以我在下面发布我实施的解决方案:
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.inflate,这弄乱了活动的状态。
我有同样的问题,但我的问题发生在方向改变上。其他解决方案均无效。所以事实证明,在根据屏幕尺寸进行两个或一个窗格布局时,我忘记从片段中删除 setRetainInstance(true);
。
我的错误出现在 FragamentTransaction
上。
我正在这样做 t.replace(R.layout.mylayout);
而不是 t.replace(R.id.mylayout);
不同之处在于一个是布局,另一个是对 layout(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
之前设置了片段。哎呀。
setContentView
放入了我的 onBuildHeaders
此页面似乎是发布有关 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 布局文件的名称。有关详细信息,请参阅 Re-using Layouts with include。
当您从另一个片段中的片段调用时会发生这种情况。
利用 :
getActivity().getSupportFragmentManager().beginTransaction();
我在我的项目中使用 View Binding 并且在膨胀 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、进行片段替换以及在 onAttachedToWindow 事件中调用 getMapAsync()。
我忘记做的是确保我的代码没有运行两次。即在 onAttachedToWindow 事件中,检查我的动态 SupportMapFragment 是否仍然为空,然后再尝试创建它的新实例并进行片段替换。当项目离开 RecyclerView 的顶部时,它会与窗口分离,然后在您滚动回它时重新附加,因此会多次触发此事件。
一旦我添加了空检查,每个 RecyclerView 项目只发生一次,问题就消失了! TL;博士!
我修复了这个错误,我使用 commitNow()
替换 commit()
。
mFragment.getChildFragmentManager()
.beginTransaction()
.replace(R.id.main_fragment_container,fragment)
.commitNowAllowingStateLoss();
commitNow
是同步方法,commit()
方法是异步方法。
当您不将 <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();
}
您必须在 onCreateView() 中返回一个视图,以便稍后替换它您可以在片段提升周期的以下函数中对该视图进行任何操作,例如 onActivityCreated()
希望这可以帮助!
在我的情况下,当我为相同的布局元素(片段占位符)使用不同的 id 而同时为不同的 Build Variants 使用不同的 id 时,会引发此异常。出于某种原因,当您第一次替换片段时它工作得很好,但是如果您再次尝试这样做,您会得到这个异常。因此,如果您对不同的构建变体有多个布局,请确保使用相同的 id。
我遇到了这个问题。在我的情况下,我忘记在我的 XML 文件中添加 FrameLayout,添加框架布局后,我的问题已经解决。
<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);
在创建活动时进行片段事务时,我遇到了同样的问题。
核心问题是Nick has already pointed out - 视图树尚未膨胀。但他的解决方案不起作用——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 的两个片段中有两个视图时,也会发生这种情况
RelativeLayout
中的TextView
是RelativeLayout
的子代。include
代码,然后我被困了 2 个小时试图解决这个问题。