方向更改后布局不刷新

时间:2014-06-12 08:51:50

标签: 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: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>

现在在我的代码中,我在breadCrumb LinearLayout中动态添加按钮:

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

    setContentView(R.layout.activity_inspection);
    LinearLayout mainLayout = (LinearLayout) findViewById(R.id.inspectionMainLayout);

    if (mainLayout != null) {
        ExpandableListView list = (ExpandableListView) findViewById(R.id.expandableListView);

        list.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
            @Override
            public boolean onChildClick(ExpandableListView expandableListView, View view, int i, int i2, long l) {
                LinearLayout breadCrumb = (LinearLayout) findViewById(R.id.breadCrumb);

                Button filterButton = new Button(InspectionActivity.this);
                filterButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        onFilterButtonClick((Button) view);
                    }
                });

                filterButton.setText(item.getFormattedFilter());

                breadCrumb.addView(filterButton);
            }
        }
    }       
    ...
}

此代码运行良好,直到我不更改设备方向并重新创建我的活动。虽然所有代码都正确执行,但屏幕似乎没有更新。恢复上一个方向后,所有项目都会突然出现。知道为什么以及如何解决它?

由于

编辑:

我认为我遇到的问题与本文中描述的相同: Android: findViewById gives me wrong pointer?

关于如何解决这个问题的任何想法?

按要求我的onRestoreInstanceState:

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

    baseCategories = savedInstanceState.getParcelable(BASE_CATEGORIES_STATE);
    currentFilter = savedInstanceState.getParcelable(FILTERS_STATE);
}

和onSaveInstanceState:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    outState.putParcelable(BASE_CATEGORIES_STATE, baseCategories);
    outState.putParcelable(FILTERS_STATE, currentFilter);
}

现在我的两个类都实现了Parcelable接口。 它们被持久化并正确恢复。

对于某些人来说,对findViewById的调用让我指出错误的对象(不是重新创建的对象)。

2 个答案:

答案 0 :(得分:0)

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

一些可能性:

  • 通过在AndroidManifest.xml中为您的活动声明android:configChanges="keyboardHidden|orientation|screenSize",避免重新创建屏幕旋转活动 - 这非常不推荐

  • &#34;记住&#34;在轮换后重新创建活动时动态添加了哪些视图(例如,使用额外的标记来检测添加了新的过滤器按钮并通过onSaveInstanceState中的包传递它,并检入onCreate是否需要重新创建按钮),或按照here

  • 所述保留整个视图对象

另外一个注意事项:您可能想要指定&#34; vertical&#34; breadCrumb版面的方向,默认为水平。

答案 1 :(得分:0)

我发现了为什么会这样。

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(它已恢复),因此它们可以指向正确的实例。

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

由于