1

在以下代碼中,片段正在從佈局xml動態膨脹。我面臨的問題是我旋轉設備時看不到碎片。在定向更改中不可見的片段

如果我看看fragmentManager,我確實看到了片段。他們被添加和附加,但沒有在屏幕上的任何地方。

MenuCard extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.content); 

     leftContainer = (FrameLayout) findViewById(R.id.leftContainer); 
     rightContainer = (FrameLayout) findViewById(R.id.rightContainer); 


     Fragment fragment = mFragmentManager.findFragmentById(R.id.leftFragment); 
     if (fragment == null) { 
      LayoutInflater.from(this).inflate(R.layout.left_fragment, leftContainer); 
     } 

     fragment = mFragmentManager.findFragmentById(R.id.rightFragment); 
     if (fragment == null) { 
      LayoutInflater.from(this).inflate(R.layout.right_fragment, rightContainer); 
       } 
      } 
     } 
    } 

} 

R.layout.left_fragment

<?xml version="1.0" encoding="utf-8"?> 
<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/leftFragment" 
    android:name="com.example.LeftFragment" 
    tools:layout="@layout/left_fragment"> 

</fragment> 

R.layout.right_fragment

<?xml version="1.0" encoding="utf-8"?> 
<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/rightFragment" 
    android:name="com.example.LeftFragment" 
    tools:layout="@layout/left_fragment"> 

</fragment> 

添加代碼R.layout.content

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.SlidingPaneLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/spl" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

    <FrameLayout 
     android:id="@+id/leftContainer" 
     android:layout_width="320dp" 
     android:layout_height="match_parent" 
     android:background="#00AFF0" 
     /> 

    <FrameLayout 
     android:id="@+id/rightContainer" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     /> 
</android.support.v4.widget.SlidingPaneLayout> 
+0

你能分享你的content.xml嗎? – 2015-04-04 02:55:48

+0

它看起來很好,雖然它有點有趣,你附加碎片的方式,但它應該工作。我注意到你已經在left_fragment.xml和right_fragment.xml中指定了LeftFragment。你確定碎片本身實際上是在屏幕上顯示任何東西嗎?你能用一個帶有彩色背景的片段做一個簡單的測試,並確保它顯示出來嗎? – 2015-04-04 03:06:43

+0

它們在加載時顯示內容完美。旋轉時的問題。 mContainerId,mView,mInnerView全爲空。但片段是可見的,附加和添加:o – user210504 2015-04-04 03:10:06

回答

0

你可以試試在清單中添加以下行IDE片段活動的聲明:

android:configChanges="screenSize|orientation" 

這將防止對的onCreate朝向的變化屏幕方向change.For處理,您可以覆蓋onConfigurationChanges。

+1

這就規避了這個問題,第二次看到問題時我有了這個解決方案。我更感興趣的是想知道我所看到的是什麼,爲什麼。 – user210504 2015-04-04 05:30:15

0

所以很多的片段管理器代碼的閱讀後,我遇到了這些神奇的線:

// For fragments that are created from a layout, when restoring from 
// state we don't want to allow them to be created until they are 
// being reloaded from the layout. 

,這意味着我的情況正確的代碼是

@覆蓋 保護無效的onCreate(捆綁savedInstanceState){ super.onCreate(savedInstanceState);

setContentView(R.layout.content); 

    leftContainer = (FrameLayout) findViewById(R.id.leftContainer); 
    rightContainer = (FrameLayout) findViewById(R.id.rightContainer); 

    LayoutInflater.from(this).inflate(R.layout.left_fragment, leftContainer); 
    LayoutInflater.from(this).inflate(R.layout.right_fragment, rightContainer); 


    } 
} 

SupportFragmentManager將在方向更改的情況下重新使用片段,並只擴大布局。

0

我從來沒有嘗試過你的設計,但我覺得它很有趣。雖然我不推薦它。

因爲方向已更改,所以不會重新創建UI。這是因爲Activity未被重新創建,因此onCreate在方向改變時不會被觸發。當屏幕由於不同的因素而改變時,觸發onCreateView。我從來沒有在Activity子類中嘗試過。它通常在Fragment子類中完成。實際上,onCreate只有在應用程序因用戶操作或崩潰而停止時纔會觸發。

如果/當我在Activity中找到onCreateView方法的好樣本,我會發布它。

相關問題