2012-09-10 35 views
7

我有一個具有EditText和Button的佈局。我在<include>它在我的主要佈局。在屏幕旋轉時自行復制的佈局

我的佈局和旋轉有一個奇怪的問題。當設備(物理)旋轉時,它似乎會自我複製,搞亂了文本和佈局。

這是首開,之後我添加一些額外的斷章取義:

1

DSC_0013在EditText上上推出的片段。

然後,我在旋轉手機,並添加一些不同的斷章取義:

2

而且你可以很清楚地看到這個問題。起初,我認爲這只是EditText搞亂了。但是,如果我補充足夠的文字,使一個新行:

3

我可以看到按鈕被搞砸了。

我確實覆蓋了onSaveInstanceState,但在其中我沒有觸及EditText或它的值,它嚴格用於別的東西。

發生了什麼?如何解決?

+0

您如何設置視圖? 'setContentView' + XML? '唯一的addView'? – Eric

回答

13

修正了它!

原來這不是視圖重複自己,或EditText,或按鈕。這是整個片段。

在我的活動的onCreate,我的片段添加到一個XML佈局:

private FileDetails fileDetailsFragment; 

public void onCreate(Bundle savedInstanceState) { 
     ... 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager 
       .beginTransaction(); 
     fileDetailsFragment = new FileDetails(fileData); 
     fragmentTransaction.add(R.id.DetailsHolder, fileDetailsFragment); 
     fragmentTransaction.commit(); 

而且onCreate是被稱爲我每次旋轉手機時(因爲它的意思)。所以我進行了檢查,看看這個活動是否是第一次運行,並且效果很好。

private FileDetails fileDetailsFragment; 

public void onCreate(Bundle savedInstanceState) { 
    ... 
    if (savedInstanceState == null) { 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager 
       .beginTransaction(); 
     fileDetailsFragment = new FileDetails(fileData); 
     fragmentTransaction.add(R.id.DetailsHolder, fileDetailsFragment); 
     fragmentTransaction.commit(); 
    } else { 
     fileDetailsFragment = (FileDetails) getSupportFragmentManager().findFragmentById(R.id.DetailsHolder); 
    } 
+4

一年多後,這個解決方案剛剛幫助我:)非常感謝發佈此! –

+0

現在三年多了^^ – 8m47x

+0

還是很有用的答案 – user1111527

1

您也可以setRetainedInstance(真)在您的片段,然後嘗試獲得片段形式去FragmentManager.findFragmentById(INT)或FragmentManager.findFragmentByTag(字符串),如果返回null這意味着你必須創建一個新的Fragment實例。

private FileDetails fileDetailsFragment; 


public void onCreate(Bundle savedInstanceState) { 
... 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    fileDetailsFragment = (FileDetails) getSupportFragmentManager().findFragmentById(R.id.DetailsHolder); 
    if (fileDetailsFragment == null) { 
     fileDetailsFragment = new FileDetails(FileData); 
    } 

    FragmentTransaction fragmentTransaction = fragmentManager 
      .beginTransaction(); 

    fragmentTransaction.add(R.id.DetailsHolder, fileDetailsFragment); 
    fragmentTransaction.commit(); 
}