我正在尝试为应用程序创建双窗格/单窗格设置。在我将所有内容放入碎片中之前,它工作正常,我不知道是什么导致它无法工作。当我进行方向改变时,问题就出现了。起初,由于某种原因,它没有重新创建视图。它会调用onCreateView,但是我无法获得视图内部listview的句柄并且变为null(我知道我的布局对于横向和纵向是正确的,因为它在纵向和横向都有效,如果它从那里开始)。所以,我所做的是将setRetainInstance添加为true,认为这可以解决我的问题。好吧,这提出了另一个问题,现在我得到No View Found For 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();
//}
}
我曾尝试使用片段管理器查找片段并将其重新分配给不同的布局,但由于某种原因,它仍在寻找旧的片段。
答案 0 :(得分:2)
您必须按以下方式重写代码:
//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();
}