Android Fragment没有find的ID的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"); }
当这个代码被执行时,我得到在debugging中的以下错误。
java.lang.IllegalArgumentException: No view found for id 0x7f080011 for fragment feed_parser_activity{41882f50 #2 id=0x7f080011}
feed_parser_activity
是一个在xml中设置为Fragment布局的片段。
我正在使用FragmentActivity来托pipe包含feed_parser_layout
的片段布局。
我在上面正确地编码?
我也遇到过这个问题,直到我意识到我已经在FragmentActivity的onCreate()
方法的setContentView()
中指定了错误的布局。
传递给FragmentTransaction.add()
的id,在你的情况下, R.id.feedContentContainer
,必须是setContentView()
指定的布局的子R.id.feedContentContainer
。
你没有向我们展示你的onCreate()
方法,所以也许这是同样的问题。
当嵌套Fragments并用getSupportFragmentManager()而不是getChildFragmentManager()添加它们时,也会发生此错误。
解决scheme是使用getChildFragmentManager()
而不是getFragmentManager()
当从一个片段调用。 如果您正在从一个活动调用该方法,则使用getFragmentManager()
。
这将解决问题。
我有这个问题(当在代码中构build我的用户界面),这是由我的ViewPager
(显示Fragment
s)没有一个ID设置,所以我只是使用pager.setID(id)
,然后它的工作。
这个页面帮我弄清楚了。
我见过的另一个场景 如果你使用嵌套片段,说一个片段的ViewPager与它的页面也是片段。
当您在内部片段(ViewPager的页面)中执行片段事务时,您将需要
FragmentManager fragmentManager = getActivity().getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
getActivity()是这里的关键。 …
我在另一个类似于这个问题的线程上读到了一个答案,当我遇到这个问题时,这个问题涉及到布局xml。
你的logcat说“没有findid为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:21.0.0
,出现了这个错误。
我不得不改变我的布局:
<?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>
所以布局必须有一个子视图。 我假设他们在新图书馆强制执行。
如果您传递给FragmentTransaction.replace(int ID, fragment)
布局FragmentTransaction.replace(int ID, fragment)
存在于其他正在充气的布局中,也会发生此exception。 确保布局ID是唯一的,它应该工作。
我有同样的问题,但我的问题发生在方向改变。 没有其他解决scheme的工作。 所以事实certificate,我忘了删除setRetainInstance(true);
从我的片段,根据屏幕大小做两个或一个窗格布局。
我知道这已经被回答了一个场景,但是我的问题有点不同,我想我会分享以防其他人在我的鞋子里。
我在onCreate()
做了一个事务,但是在这一点上view tree没有被夸大,所以你得到了同样的错误。 把事务代码放在onResume()
使一切运行良好。
所以只要确保你的交易代码在视图树被充满后运行!
在我的情况下,我试图显示一个包含一个分页器的DialogFragment,当FragmentPagerAdapter尝试将分页添加到分页器时抛出这个exception。 基于howettl答案我猜这是由于寻呼机父母是不是我的FragmentActivity setContentView()中设置的视图。
我做的唯一解决问题的方法是创build一个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); pagerAdapter.setAdapter(pagerAdapter); return rootView; }
}
我的错误是在FragamentTransaction
。
我正在做这个t.replace(R.layout.mylayout);
而不是t.replace(R.id.mylayout);
不同的是,一个是布局,另一个是对layout(id)
的引用
在Recycler View中使用Viewpager时,我正面临一个讨厌的错误。 在特殊情况下我遇到了以下错误。 我开始了一个有Viewpager的RecyclerView的片段(使用FragmentStatePagerAdapter)。 它运行良好,直到我在RecyclerView中点击一个单元切换到不同的片段,然后使用手机的硬件返回button和应用程序崩溃导航回来。
而有趣的是,我在同一个RecyclerView中有两个Viewpage,两个都离开了大约5个单元格(其他的在屏幕上不可见,因此它已经closures)。 所以最初我只是将解决scheme应用到第一个ViewPager,并保持原样(Viewpager使用片段)。
当第一个查看传呼机可见时,导航返回正常工作。 现在,当我滚动到第二个,然后改变片段,回来,它坠毁(同样的事情发生在第一个)。 所以我必须改变这两个Viewpagers。
无论如何,阅读下面find工作的解决scheme。 崩溃错误如下:
java.lang.IllegalArgumentException: No view found for id 0x7f0c0098 (com.kk:id/pagerDetailAndTips) for fragment ProductDetailsAndTipsFragment{189bcbce #0 id=0x7f0c0098}
花费几个小时来debugging它。 阅读完整的线程post,直到底部应用所有的解决scheme,包括确保我传递childFragmentManager。
没有工作。
最后,我没有使用FragmentStatePagerAdapter,而是扩展了PagerAdapter,并在不使用片段的情况下在Viewpager中使用它。 我相信一些有嵌套片段的BUG。 无论如何,我们有select。 阅读…
下面的链接是非常有用的:
没有片段的Viewpager
链接可能会死,所以我发布我的实施解决scheme在这里下面:
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; }
}
希望这是有帮助的!
我有同样的问题,让我发布我的代码,以便你们都可以看到它,而不是做我做的同样的事情。
@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
之前设置了片段。 糟糕!
这个页面似乎是发布关于碎片IllegalArgumentException的build议的一个好的中心位置。 这里还有一件事你可以尝试。 这是最后为我工作的:
我忘记了我有一个单独的横向布局文件。 在我添加了我的FrameLayout容器之后,片段也工作了。
另外,如果你已经尝试了这个页面(和整个互联网)上build议的所有东西,并且已经把你的头发拉出了几个小时,可以考虑把这些令人讨厌的碎片扔掉,然后回到一个很好的旧标准布局。 (当我最终发现我的问题时,实际上是我正在做的事情)。你仍然可以使用容器的概念。 然而,你可以使用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布局文件的名称。 有关更多信息,请参阅使用包含重新使用布局 。
在更改xml布局文件中的任何内容后,始终清理您的项目。
在eclipse上:Project> Clean
当我尝试用onCreateView()
片段replace视图时,我遇到了这个问题。 喜欢这个:
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()
返回一个视图,以便稍后进行replace - 您可以在片段liftcycle中的以下函数中对此视图执行任何操作,如
onActivityCreated()
希望这可以帮助!
在我的情况下,我有一个在回收视图项目的SupportMapFragment(我正在使用较低的开销“liteMode”,这使得地图显示为非交互式,几乎像一个静态图像)。 我正在使用正确的FragmentManager,一切似乎正常工作…与一个小列表。 一旦项目列表超过了屏幕高度一点,然后我开始在滚动时遇到这个问题。
原来,这是因为我在一个视图内部注入了一个dynamic的SupportMapFragment,这个视图在另一个片段中,以解决我在XML中静态声明时遇到的一些问题。 因此,片段占位符布局只能在视图附加到窗口后才能replace为实际片段,即在屏幕上可见。 所以我把我的代码初始化SupportMapFragment,做片段replace,并在onAttachedToWindow事件中调用getMapAsync()。
我忘了做的是确保我的代码没有运行两次。 即在onAttachedToWindow事件中,检查我的dynamicSupportMapFragment是否仍为null,然后尝试创build一个新的实例并执行Fragmentreplace。 当物品离开RecyclerView的顶部时,它将从窗口中分离出来,然后再次滚动时再重新连接,所以这个事件被多次触发。
一旦我添加了空检查,每个RecyclerView项目只发生一次,问题就消失了! TL; DR!
如果您尝试使用fragmentManagerreplace片段中的片段,但是您没有使可能导致问题的父片段膨胀 。
在BaseFragment.java中 OnCreateView
:
if (savedInstanceState == null) { getFragmentManager().beginTransaction() .replace(R.id.container, new DifferentFragment()) .commit(); } return super.onCreateView(inflater, container, savedInstanceState);
replacesuper.onCreateView(inflater, container, savedInstanceState);
与膨胀正确的布局为片段:
return inflater.inflate(R.layout.base_fragment, container, false);
我在创build活动时做了片段事务时也遇到了同样的问题。
核心问题是Nick已经指出 – 视图树还没有膨胀呢。 但他的解决scheme并没有工作 – 在onResume,onPostCreate等相同的例外
解决方法是将callback添加到容器片段,以便在准备就绪时发出信号:
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。 我正在使用android:id="@+id/someName"
而应该使用:
<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent" />
在你的片段内使用这个:
int id = this.getId();