我有以下活动定义:
<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的调用让我指出错误的对象(不是重新创建的对象)。
答案 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(它已恢复),因此它们可以指向正确的实例。
处理这种情况有什么模式吗?
由于