3

我正在尝试为应用程序创建双窗格/单窗格设置。在我将所有内脏放入碎片之前,它工作正常,我不知道是什么导致它不起作用。当我进行方向更改时,问题就出现了。起初,由于某种原因,它没有重新创建视图。它会调用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();
    //}
}

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

4

1 回答 1

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

    }
于 2013-02-19T16:30:27.243 回答