我正在将TextView添加到我的布局中,并且我想在屏幕方向改变时保留它们。
我尝试了以下代码,但它无效。
public class DetailsActivity extends Activity {
private HashMap<View, TextView> views = new HashMap<View, TextView>();;
@Override
public Object onRetainNonConfigurationInstance() {
return views;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.layout44);
findViewById(R.id.layout44_11).setOnLongClickListener(onLongClickListener);
...
HashMap<View, TextView> data = (HashMap<View, TextView>)this.getLastNonConfigurationInstance();
if (data == null) {
System.out.println("is null");
} else {
for(View key : data.keySet()) {
ViewGroup parent = (ViewGroup) key;
System.out.println(key + " " + data.get(key));
System.out.println(parent.getChildCount());
System.out.println("child: " + parent.getChildAt(0));;
parent.removeView(data.get(key));
data.get(key).setText("asd");
data.get(key).setVisibility(View.VISIBLE);
parent.addView(data.get(key));
}
System.out.println("-------------------");
}
}
private View.OnLongClickListener onLongClickListener = new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
ViewGroup parent = (ViewGroup) v;
if(parent != null) {
TextView tv = new TextView(getApplicationContext());
tv.setText("TextView");
views.put(parent, tv);
parent.addView(tv);
}
return false;
}
};
}
我得到例外:
引起:java.lang.IllegalStateException:指定的子级 已经有了父母。您必须在孩子的父母上调用removeView() 第一
为什么呢?我究竟做错了什么?怎么解决?
答案 0 :(得分:3)
当您更改屏幕方向时,您正在执行的操作是破坏您的活动,然后重新开始它。
如果您在onCreate()方法中添加了10个TextView,请不要担心,它们将完全按照以前的方式添加,而不进行任何交互。
但是,如果您的活动有一些用户输入或某些处理使活动有状态(活动已按下按钮或提交数据),您将需要使用onSavedInstanceState(Bundle out)
来保存所有状态信息(基本类型,不视图),然后在onCreate()
中,您可以从Bundle中提取此信息以重新创建状态。
从不在活动周围(或方向更改之间)传递Views
。视图由其活动拥有,当它们被传递时,它们会带来原始活动。
如果您是Android新手,请按以下方式考虑: 如果你在一个美术馆,建筑即将被拆除,一个新的艺术画廊即将建成(你从风景转换为肖像),那么你将想要从第一画廊获取所有的艺术作品,然后把它放在新的画廊。你不会从第一个画廊撕开墙壁(视图)来建造第二个画廊,你将建造第二个画廊,然后将艺术品挂在新画廊的墙壁(视图)上。