2

我正在開發一個Android活動,其中有兩個片段。活動有兩種可能的佈局,一個在Portait,另一個在景觀。使用Fragments更改Android佈局

我已經創建了碎片運行良好,但當我改變手機/平板電腦的方向時遇到了麻煩。

此片段之一是列表片段,使用AsyncTask從Web上加載列表數據。有了這個片段,我沒有問題,因爲我可以再次創建它。 (雖然需要一段時間的加載)。

另一片段內部具有谷歌地圖的V2片段:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <fragment 
     android:id="@+id/mapInicio" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     class="com.google.android.gms.maps.SupportMapFragment" /> 

</LinearLayout> 

我創建從onCreate方法FragmentActivity的片段:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_inicio); 



    Fragment listFragment = new ListaEstaciones(); 
    FragmentTransaction transList = getSupportFragmentManager() 
      .beginTransaction(); 
    transList.add(R.id.listaestaciones_f_container, listFragment); 
    transList.commit(); 



    Fragment mapFragment = new MapaGoogleV2(); 
    FragmentTransaction transMap = getSupportFragmentManager() 
      .beginTransaction(); 
    transMap.add(R.id.mapa_f_container, mapFragment); 
    transMap.commit(); 



} 

onConfigurationChanged方法中,我這段代碼。作爲onCreate,我創建了碎片,我改變看法,因爲我們現在是橫向/縱向:

public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 


    setContentView(R.layout.activity_inicio); 

    Fragment listFragment = new ListaEstaciones(); 
    FragmentTransaction transaction = getSupportFragmentManager() 
      .beginTransaction(); 
    transaction.add(R.id.listaestaciones_f_container, listFragment); 
    transaction.commit(); 



    Fragment mapFragment = new MapaGoogleV2(); 
    FragmentTransaction transMap = getSupportFragmentManager() 
      .beginTransaction(); 
    transMap.add(R.id.mapa_f_container, mapFragment); 
    transMap.commit(); 

} 

當我創建這個方法ListFragment的偉大工程,但不與MapFragment工作。 片段的onCreateView方法中的應用chrash與地圖。我認爲不能再膨脹該片段:

04-16 18:20:32.795:E/AndroidRuntime(15543):android.view.InflateException:二進制XML文件線#6:錯誤充氣類片段

我的問題:

有沒有一種方法,以避免碎片的休閒改變佈局時?

我該怎麼做?

謝謝!

+0

聽起來很像:http://stackoverflow.com/questions/8495095/fragments-and-handling-orientation-changes –

+0

@PlasticSturgeon是不一樣的。我只有谷歌地圖碎片問題,而不是我的ListFragment。 – palvarez89

+0

也許這個呢? http://stackoverflow.com/questions/14488566/android-maps-v2-maps-becomes-unresponsive-on-orientation-changed –

回答

2

如果您不使用onConfigurationChanged方法,則無法避免活動的破壞,但此解決方案有時難以處理。

經過網上的研究,我發現very interesting article談論如何處理片段mannualy的娛樂,但這種解決方案不適用於我的地圖片段。

我最終的解決方案是讓Android自動更改佈局,從清單中刪除android:configChanges=」orientation」

另外,我不能使用封閉Google Map V2的Map Fragment。我直接使用Google Map V2片段。

要保留片段的情況下,你只需要把指令setRetainInstance(true)

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_inicio); 

    Fragment listFragment = new ListaEstaciones(); 
    listFragment.setRetainInstance(true); 
    FragmentTransaction transList = getSupportFragmentManager() 
     .beginTransaction(); 
    transList.add(R.id.listaestaciones_f_container, listFragment); 
    transList.commit(); 
} 

感謝您的幫助。

+0

謝謝android:configChanges =「orientation」這行定義活動清單中我的問題解決了...... !!! –

0

如果您需要的是縱向和橫向不同的佈局,則可以使用更簡單的方法來完成此操作。創建一個文件夾layout-land並將佈局XML放在那裏,以便爲要在橫向中指定不同佈局的任何片段/活動。取決於方向,Android會照顧使用哪種佈局。有關更多信息,請參見developer.android.com上的Check out this page

Here's another example我的意思是。

+0

我已經試過這個,而且我有同樣的問題。 – palvarez89