在屏幕旋转时,布局会重复出现

10
我有一个包含EditText和Button的布局,我在主布局中使用<include>引用它。
当设备(物理)旋转时,布局出现了奇怪的问题。它似乎会复制自己,导致文本和布局混乱。
这是第一次打开时的样子,之后我添加了一些额外的内容:

1

DSC_0013在片段启动时出现在EditText中。

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

2

您可以清楚地看到问题。起初,我以为只是EditText出了问题。但是如果我添加足够的文本来换行:

3

我看到按钮也出现了问题。
我确实重写了 onSaveInstanceState 方法,但在其中没有触碰 EditText 或其值,它严格用于其他事情。
发生了什么,我该如何修复?

你如何设置视图?使用 setContentView + XML 吗?还是仅使用 addView - Cat
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);
    }

4
一年多过去了,这个解决方案帮了我大忙 :) 非常感谢您发布这个! - Alex
1
现在已经三年了 ^^ - Tomblarom
1
仍然是非常有用的答案。 - user1111527

1
您还可以在片段上调用setRetainedInstance(true),然后尝试通过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();
}

0
在某些情况下,在旋转后savedInstanceState的值可能为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);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接