未找到 ID 的 Android 片段
Posted
技术标签:
【中文标题】未找到 ID 的 Android 片段【英文标题】:Android Fragment No View Found for id 【发布时间】:2013-02-01 19:09:55 【问题描述】:我正在尝试为应用程序创建双窗格/单窗格设置。在我将所有内脏放入碎片之前,它工作正常,我不知道是什么导致它不起作用。当我进行方向更改时,问题就出现了。起初,由于某种原因,它没有重新创建视图。它会调用onCreateView,但我无法在视图内的listview上获得句柄并且变得空(我知道我的布局对于横向和纵向都是正确的,因为如果它从那里开始,它可以在纵向和横向上工作)。所以,我所做的是将 setRetainInstance 添加到 true,认为这可以解决我的问题。好吧,这带来了另一个问题,我现在没有为 ID 找到视图。
我认为现在正在发生的事情是它试图将自己重新附加到它在方向更改之前拥有的 ID,并且它不像现在在不同的布局上那样存在。我尝试创建一个新片段并添加它,但这也不起作用。我正在努力使用几乎无法使用的 android 思想片段系统。任何帮助,将不胜感激。这是相关代码
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
this.setContentView(R.layout.study_guide);
//Create The Ad Service
//Check to see if the view is landscape or portrait
if (this.findViewById(R.id.singlePaneStudyGuide) != null)
mDualPane = false;
else if (this.findViewById(R.id.doublePaneStudyGuide) != null)
mDualPane = true;
LinearLayout layout = (LinearLayout)findViewById(R.id.addbox);
adView = new AdView(this,AdSize.SMART_BANNER,"a1511f0352b42bb");
layout.addView(adView);
AdRequest r = new AdRequest();
r.setTesting(true);
adView.loadAd(r);
//Inflate Fragments depending on which is selected
//if (savedInstanceState == null)
FragmentManager fm = this.getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
SGListFragment newFrag = new SGListFragment();
if (mDualPane == true)
ft.add(R.id.sgScrollContainer, newFrag, "SgListView").commit();
else
ft.add(R.id.singlePaneStudyGuide, newFrag, "SgListView").commit();
fm.executePendingTransactions();
//
我尝试使用片段管理器查找片段并将其重新分配到不同的布局,但由于某种原因它仍在寻找旧布局。
【问题讨论】:
请同时为纵向和横向添加 study_guide.xml 的内容 【参考方案1】:你必须重写你的代码如下:
//Inflate Fragments depending on which is selected
//if (savedInstanceState == null)
FragmentManager fm = this.getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
// here the trick starts
int oldId = (mDualPane == true) ? R.id.singlePaneStudyGuide
: R.id.sgScrollContainer;
Fragment oldFragment = fm.findFragmentById(oldId);
if(null != oldFragment)
ft.remove(oldFragment);
ft.commit();
fm.executePendingTransactions();
ft = fragmentManager.beginTransaction();
// end of tricks
SGListFragment newFrag = new SGListFragment();
if (mDualPane == true)
ft.add(R.id.sgScrollContainer, newFrag, "SgListView").commit();
else
ft.add(R.id.singlePaneStudyGuide, newFrag, "SgListView").commit();
【讨论】:
我设法通过在片段端使用 findView 而不是 getActivity().findViewById 来修复它。这周的某个时候我会试试这个,看看它是否效果更好。现在,当我改变方向时,它会丢失原来的位置并开始一个新片段而不是获取旧片段。所以,我会试一试,让你知道。谢谢 要让片段在配置更改期间存活,请尝试 setRetainInstance(true) (developer.android.com/reference/android/app/…)。另外在此处查看有关片段生命周期的更多信息:marakana.com/s/post/1250/android_fragments_tutorial 是的,setRetainInstance(true) 仍然会导致 FC。它正在寻找它最初所在的视图,而不是新的视图...... 那么 - 为什么不尝试我的答案中的代码呢?此代码在活动恢复保存的片段状态之前从视图中删除片段 - 但您仍然将其保存在 oldFragment 变量中,并且可以将其放置在另一个容器中,或者只是考虑对您必须保留的数据使用“不可见”片段。以上是关于未找到 ID 的 Android 片段的主要内容,如果未能解决你的问题,请参考以下文章
IllegalArgumentException:尝试 setView 时未找到片段 id 的视图
如何在 ViewPager 中从 Activity 移动到 Fragment?未找到片段 ID 的视图
java.lang.IllegalArgumentException:没有为片段的 id 0x1020002 (android:id/content) 找到视图