10

我有一个包含 EditText 和 Button 的布局。我<include>在我的主要布局中。

我对布局和旋转有一个奇怪的问题。当设备(物理)旋转时,它似乎会自我复制,弄乱文本和布局。

在我添加了一些额外的乱码之后,它是第一次打开的:

1

DSC_0013 在片段启动时的 EditText 中。

然后,我旋转手机并添加一些不同的乱码:

2

你可以很清楚地看到这个问题。起初,我认为这只是 EditText 搞砸了。但是,如果我添加足够的文本来换行:

3

我可以看到按钮也被弄乱了。

我确实 override onSaveInstanceState,但在其中我没有触及 EditText 或其值,它严格用于其他用途。

发生了什么事,我该如何解决?

4

3 回答 3

16

修复!

原来它不是复制自身的视图,也不是 EditText 或 Button。这是整个片段。

在我的 Activity 中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);
    }
于 2012-09-10T00:28:06.980 回答
1

您还可以在您的片段上设置RetainedInstance(true),然后尝试获取片段形式 de FragmentManager.findFragmentById(int) 或 FragmentManager.findFragmentByTag(String),如果它返回 null,则意味着您必须创建片段的新实例.

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();
}
于 2016-05-25T14:30:58.517 回答
0

在某些情况下,saveInstanceState 的值在轮换后可能为 null,所以最好再加一个条件:

FragmentManager fragmentManager = getSupportFragmentManager();
if (savedInstanceState == null && 
    fragmentManager.getFragments().size() == 0) {
        
        FragmentTransaction fragmentTransaction = fragmentManager
                .beginTransaction();
        fileDetailsFragment = new FileDetails(fileData);
        fragmentTransaction.add(R.id.DetailsHolder, fileDetailsFragment);
        fragmentTransaction.commit();
    } else {
        fileDetailsFragment = (FileDetails) 
        getSupportFragmentManager().findFragmentById(R.id.DetailsHolder);
    }
于 2020-11-14T15:21:26.040 回答