Android 方向更改后布局未刷新

Android 方向更改后布局未刷新,android,android-layout,android-activity,android-orientation,Android,Android Layout,Android Activity,Android Orientation,我有以下活动定义: <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/inspectionMainLayout" xmlns:android="http://schemas.android.com/apk/res/android">

我有以下活动定义:

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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:singleLine="false"
        android:id="@+id/breadCrumb"
        android:visibility="gone">
    </LinearLayout>

    <ExpandableListView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/expandableListView" />

</LinearLayout>
在我不更改设备方向并重新创建活动之前,此代码工作正常。虽然所有代码都正确执行,但屏幕似乎没有更新。一旦我恢复上一个方向,所有项目都会突然出现。知道为什么以及如何修复它吗

谢谢

编辑:

我确实认为我遇到了与本文描述的相同的问题:

有没有办法解决这个问题

根据请求,我的onRestoreInstanceState:

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

    baseCategories = savedInstanceState.getParcelable(BASE_CATEGORIES_STATE);
    currentFilter = savedInstanceState.getParcelable(FILTERS_STATE);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    outState.putParcelable(BASE_CATEGORIES_STATE, baseCategories);
    outState.putParcelable(FILTERS_STATE, currentFilter);
}
在onSaveInstanceState上:

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

    baseCategories = savedInstanceState.getParcelable(BASE_CATEGORIES_STATE);
    currentFilter = savedInstanceState.getParcelable(FILTERS_STATE);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    outState.putParcelable(BASE_CATEGORIES_STATE, baseCategories);
    outState.putParcelable(FILTERS_STATE, currentFilter);
}
现在,我的两个类都实现了Parcelable接口。 它们被正确地保存和恢复

仍然有一段时间,在调用findViewById get's时,我指向了错误的对象(不是重新创建的对象)。

动态添加视图(在用户单击事件时)
默认情况下,android不会“记住”在配置更改时重新创建活动时保留这些动态视图,您必须自己处理此过程

一些可能性:

  • 在AndroidManifest.xml中为您的活动声明
    android:configChanges=“keyboardHidden | orientation | screenSize”
    ,以避免在屏幕旋转时重新创建活动-强烈建议不要这样做

  • “记住”在旋转后重新创建“活动”时动态添加的视图(例如,使用额外的标志来检测添加了新的筛选按钮,并通过bundle-in将其传递,然后检入
    onCreate
    是否需要重新创建按钮),或者按照说明保留整个视图对象


另外一个注意事项:您可能想为您的
面包屑布局指定“垂直”方向,默认情况下它是水平的。

我找到了发生这种情况的原因

onSave/onRestoreInstanceState我正在持久化currentFilter类,该类上有一些自定义侦听器

作为onResume方法,我正在执行以下操作:

@Override
protected void onResume() {
    if (currentFilter == null) {
            currentFilter = new FilterItemList();

            currentFilter.addListener(new FilterItemListListener() {
                @Override
                public void filterChanged(FilterChangedEvent e) {
                    filterCategories(categoryRepository);
                }

                @Override
                public void filterAdded(FilterAddedEvent e) {
                    FilterItem addedItem = e.getAddedItem();
                    baseCategories.remove(new BaseCategory("", addedItem.getSectionName()));
                }

                @Override
                public void filterRemoved(FilterRemovedEvent e) {
                    FilterItem removedItem = e.getRemovedItem();
                    baseCategories.add(new BaseCategory("", removedItem.getSectionName()));
                }
            });
    }
}
指向上一个实例的指针已持久化。这就是为什么我的接口不能正常工作的原因

现在,即使currentFilter不为null(已还原),我也会重新注册侦听器,以便它们可以指向正确的实例

处理这种情况有什么模式吗


谢谢

你能发布屏幕截图吗?这样我们就可以了解你所做的更改,也许这与android:layout\u height=“50dp”
有关,因为随着方向的改变,高度也会改变,我无法发布屏幕截图,因为它包含敏感数据。每次重新创建活动时,它都无法更新UI。例如,在他重新创建活动之后,它正确地显示了,但是如果我在示例中设置在面包屑中添加一个新按钮,它将不会显示在屏幕上,并且如果我验证面包屑对象,新添加的按钮仍然存在。我试图使面包屑视图无效,但仍然无效。有什么想法吗?你想刷新,还是不想刷新?我想以某种方式刷新它。因此,它反映了内部的视图。嗨,我正在持久化onSaveInstanceState方法上已经存在的一些数据,并在RestoreInstanceState上恢复它们。在恢复数据之后,在onResume方法中,我通过添加前面的按钮来“重新绑定”面包屑对象。一旦这样做了,如果我尝试向该视图添加一个新按钮,它就不会显示。到目前为止,我发现对前一个实例的引用以某种方式被持久化了。我的意思是,如果我调用linearlayoutbreadcrumb=(LinearLayout)findViewById(R.id.breadCrumb);第一次,我的var指向X。然后,由于方向的改变,类被重新创建。我对findviewbyd(R.id.breadCrumb)的新调用是指向另一个对象。但是,一旦触发添加,我再次调用findviewbyd(R.id.breadCrumb),它就会检索以前的实例地址。这可能吗?我在说什么蠢话吗?你能从onSave/onRestoreInstanceState发布代码吗?好吧,你保存/恢复了数据,但我看不出你在哪里重新创建了Button对象。当您的活动被重新创建时,它的整个视图层次结构都会被破坏,然后您可以从xml布局中重新膨胀它。如果你想看到你的动态按钮,你必须再次创建它,例如,基于一个保存的标志,表明按钮在旋转之前就在那里。我找到了原因。检查我的答案。看起来,如果您的类实现了Parcelable,那么他仍然隐式地持久化未在writeToParcel覆盖中指示的私有变量。这发生在我的私人ArrayList听众身上;恢复后,它包含指向上一个视图实例的指针。由于未知原因,该实例仍然有效并返回有效对象。显然,Android Bundle类不遵守IPC封送期间遵循的可包裹协议。