【问题标题】:Restore views after orientation change方向改变后恢复视图
【发布时间】:2012-08-06 21:52:56
【问题描述】:

我正在将 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;
        }
    };
}

我遇到了异常:

Caused by: java.lang.IllegalStateException: 指定的孩子 已经有了父母。您必须在孩子的父母上调用 removeView() 首先。

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

【问题讨论】:

  • 我正在将 TextViews 添加到我的布局中,并且我想在屏幕方向发生变化时保留它们。>>>> 无论如何它们仍然在屏幕上。你到底想要实现什么??
  • 正如您在附加代码中看到的,我将 TextViews 添加到布局中。更改屏幕方向后,它们会消失。我想保留它们。另外我有两种布局:纵向和横向,但我不知道它是否导致错误。

标签: android view screen-orientation


【解决方案1】:

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

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

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

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多