我正在尝试为应用程序创建双窗格/单窗格设置。在我把所有的inards放进片段之前,它工作得很好,我不知道是什么原因导致它不工作。问题是当我改变方向时。起初,由于某种原因,它没有重新创建视图。它将调用oncreateview,但我无法在视图内部的listview上获取句柄,并将其设置为空(我知道我的布局对横向和纵向都是正确的,因为它在纵向和横向都可以工作,如果它从那里开始的话)。所以,我做的是在true的基础上添加setretaininstance,以为这样可以解决我的问题。好吧,这就引出了另一个问题,现在我找不到ID的视图。
我认为现在正在发生的是它试图将自己重新连接到它在方向改变之前的id,而现在它不存在于不同的布局上。我试着创建一个新片段并添加它,但这也不起作用。我几乎要把头发拉出来,试图与安卓的有思想的碎片系统,几乎不可能与之合作。任何帮助都将不胜感激。这是相关代码

@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();
    //}
}

我试着用片段管理器寻找片段,并将其重新分配到不同的布局,但由于某种原因,它仍在寻找旧的布局。

最佳答案

你必须重写你的代码如下:

    //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();

    }

10-06 06:23