0

レイアウトに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()を呼び出す必要があります。

なんで?私は何が間違っているのですか?それを解決する方法は?

4

1 に答える 1

3

画面の向きを変更すると、実際に行っているのは、アクティビティを破棄してから、アクティビティを新たに開始することです。

onCreate()メソッドに10個のTextViewを追加した場合でも、心配する必要はありません。以前とまったく同じように、対話なしで追加されます。

ただし、アクティビティにユーザー入力またはアクティビティをステートフルにする処理が含まれている場合(アクティビティにボタンが押されたかデータが送信された場合)onSavedInstanceState(Bundle out)、すべての状態情報(基本タイプ、ビューではない)を保存するために使用する必要があります。次に、onCreate()この情報をバンドルから引き出して、状態を再作成できます。

Viewsアクティビティ(またはオリエンテーションの変更の間)を絶対に渡さないでください。ビューはアクティビティによって所有されます。ビューが渡されると、元のアクティビティが持ち込まれます。

Androidを初めて使用する場合は、次のように考えてください。アートギャラリーにいて、建物が取り壊されようとしていて、新しいアートギャラリーが構築される場合(横向きから縦向きに切り替える)、次のようになります。ファーストギャラリーからすべてのアートを取り出して、新しいギャラリーに配置したいと考えています。最初のギャラリーから壁(ビュー)を取り除いて2番目のギャラリーを構築するのではなく、2番目のギャラリーを構築してから、新しいギャラリーの壁(ビュー)にアートを掛けます。

于 2012-08-06T13:52:56.167 に答える