2013-02-17 59 views
3

我正在嘗試爲應用程序創建雙窗格/單個窗格設置。在我把所有的內臟放入碎片之前,它工作得很好,我不知道是什麼導致它不能工作。當我進行方向變更時,問題就在發生。起初,它不是由於某種原因重新創建視圖。它會調用onCreateView,但我無法獲得視圖內的列表視圖的處理,並得到空(我知道我有佈局正確的風景和肖像,因爲它在縱向和橫向工作,如果它開始在那裏)。所以,我所做的是將setRetainInstance添加爲true,認爲這可以解決我的問題。那麼,現在我得到了沒有發現身份證的其他問題。Android碎片未找到id爲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

請發表您的代碼 – Kerry 2013-02-17 08:22:44

+0

也請添加study_guide.xml的內容爲縱向和橫向 – 2013-02-18 17:41:30

回答

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

    } 
+0

我設法用findView而不是getActivity(修復它)片段端的.findViewById。我會在本週的某個時候嘗試,看看它是否更好。現在當我改變方向時,它會丟失原來的位置,並開始一個新的片段而不是舊的片段。所以,我會給你一個鏡頭,讓你知道。謝謝 – Shaun 2013-03-05 19:03:31

+0

爲了讓片段在配置更改期間生存,請嘗試setRetainInstance(true)(http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean))。另外在這裏查看關於片段生命週期的更多信息:http://marakana.com/s/post/1250/android_fragments_tutorial – 2013-03-05 20:34:20

+0

是的,setRetainInstance(true)仍然導致FC。它尋找的觀點,它最初是在,而不是新的... – Shaun 2013-03-06 00:14:34

相關問題