2014-07-03 54 views
1

我有一個使用藍牙的應用程序。我的UI顯示將由多個單獨的顯示組成,每個顯示都以碎片形式實現。其中一些比較複雜,我希望能夠根據方向重新排列顯示。如何在方向更改期間維護碎片數據?

我必須禁用活動關機,因爲如果我不掉線藍牙連接。

我嘗試了一些建議的步驟來嘗試和管理從風景到人像的方向轉換,反之亦然。使用捆綁將數據從舊的傳輸到新的藍牙。

如果我使用setRetainInstance(true);在我的Fragment中,我可以成功改變顯示而不會丟失藍牙連接,但是這個過程涉及到膨脹並創建新版本的佈局。來自前一個實例的信息不會傳遞給修訂後的佈局,並且新佈局處於非活動狀態(例如,按下按鈕可在屏幕上正確顯示,但不會更改父活動中的任何內容)。看來我正在創建一個未連接到Activity的新實例。

我也嘗試過測試方向並使用getRequestedOrientation()/ setRequestedOrientation()以編程方式更改方向。這使片段的數據保持相同的實例,但不會改變方向 - 我需要發出一個命令來重繪之後?

任何建議將受到感謝。

回答

0

問題解決 - 並且比較容易。

  1. 在Manifest中,使用android:configChanges =「orientation | screenSize」作爲主Activity配置的一部分。

  2. 沒有必要使用setRetainInstance(true);在片段onCreateView - 它似乎沒有任何區別。

  3. 在活動的onCreate的片段,向其中加入隱藏:

    // Set up the window layout 
    setContentView(R.layout.index_page_layout); 
    // Add the fragments and hide them. 
    
    FragmentManager fm = getFragmentManager(); 
    FragmentTransaction fragTrans = fm.beginTransaction(); 
    
    fragTrans.add(R.id.container, hmi1,"HMI1"); 
    fragTrans.hide(hmi1); 
    fragTrans.add(R.id.container, hmi2,"HMI2"); 
    fragTrans.hide(hmi2); 
    fragTrans.add(R.id.container, termfrag,"TERM"); 
    fragTrans.hide(termfrag); 
    fragTrans.commit(); 
    hmi1_showing = false; 
    hmi2_showing = false; 
    terminal_showing = false; 
    

    沒有專項行動採取在活動onConfigurationChanged。

  4. 在片段onConfigurationChanged,我有:

    Fragment currentFragment = getFragmentManager().findFragmentByTag("FRAGTAG"); 
    FragmentTransaction fragTransaction = getFragmentManager().beginTransaction(); 
    fragTransaction.detach(currentFragment); 
    fragTransaction.attach(currentFragment); 
    fragTransaction.commit(); 
    

    其中FRAGTAG是如在Activity.onCreate方法定義的相關標記。