方向更改后恢复视图

时间:2012-06-08 10:03:54

标签: android view screen-orientation

我正在将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()   第一

为什么呢?我究竟做错了什么?怎么解决?

1 个答案:

答案 0 :(得分:3)

当您更改屏幕方向时,您正在执行的操作是破坏您的活动,然后重新开始它。

如果您在onCreate()方法中添加了10个TextView,请不要担心,它们将完全按照以前的方式添加,而不进行任何交互。

但是,如果您的活动有一些用户输入或某些处理使活动有状态(活动已按下按钮或提交数据),您将需要使用onSavedInstanceState(Bundle out)来保存所有状态信息(基本类型,视图),然后在onCreate()中,您可以从Bundle中提取此信息以重新创建状态。

从不在活动周围(或方向更改之间)传递Views。视图由其活动拥有,当它们被传递时,它们会带来原始活动。

如果您是Android新手,请按以下方式考虑: 如果你在一个美术馆,建筑即将被拆除,一个新的艺术画廊即将建成(你从风景转换为肖像),那么你将想要从第一画廊获取所有的艺术作品,然后把它放在新的画廊。你不会从第一个画廊撕开墙壁(视图)来建造第二个画廊,你将建造第二个画廊,然后将艺术品挂在新画廊的墙壁(视图)上。