0

我正在将 TextViews 添加到我的布局中,并且我想在屏幕方向更改时保留它们。

我尝试了以下代码,但它不起作用。

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()。

为什么?我究竟做错了什么?如何解决?

4

1 回答 1

3

当您更改屏幕方向时,您实际上所做的是破坏您的活动,然后重新启动它。

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

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

永远不要绕过Views活动(或在方向更改之间)。视图归其活动所有,当它们被传递时,它们会带上它们的原始活动。

如果您是 Android 新手,可以这样想:如果您在艺术画廊中,并且建筑物即将被拆除,并且将建造一个新的艺术画廊(您从横向切换到纵向),那么您将想从第一个画廊拿走所有的艺术品,然后把它放在新的画廊里。您不会将第一个画廊的墙壁(视图)撕开来建造第二个画廊,您将建造第二个画廊,然后将艺术品挂在新画廊的墙壁(视图)上。

于 2012-08-06T13:52:56.167 回答