Android Fragment No View Found for id

时间:2013-02-17 04:16:35

标签: android view instance fragment

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

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

1 个答案:

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

    }