次のような階層があります。
データベースから取得できるデータがある限り、反復によって上記の階層を追加できるようにしたい( Parse を使用)
ImageViewとLinearLayoutを親のLinearLayoutの下に配置しようとしましたが、動作しないようです。 MainActivity.Javaのコードは次のとおりです。
LinearLayout LL_Outer = (LinearLayout) findViewById(R.id.new_linearLayoutOuter);
LL_Outer.setOrientation(LinearLayout.VERTICAL); // set orientation
LL_Outer.setBackgroundColor(color.white); // set background
// set Layout_Width and Layout_Height
LinearLayout.LayoutParams layoutForOuter = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
LL_Outer.setLayoutParams(layoutForOuter);
LinearLayout LL_Inner = (LinearLayout) findViewById(R.id.new_linearLayoutInner);
LL_Inner.setOrientation(LinearLayout.HORIZONTAL);
LL_Inner.setBackgroundColor(color.white);
LinearLayout.LayoutParams layoutForInner = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
LL_Inner.setLayoutParams(layoutForInner);
//LL_Outer.addView(LL_Inner);
ImageView IV = (ImageView) findViewById(R.id.new_imageViewPP);
//IV.getLayoutParams().height = 55;
//IV.getLayoutParams().width = 55;
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(14, 12, 0, 0);
params.height = 55;
params.weight = 55;
IV.setBackgroundColor(color.black);
IV.setLayoutParams(params);
LL_Inner.addView(IV);
LL_Outer.addView(LL_Inner);
私のコードはエラーを表示しなかったため、どこで間違ったのかわかりません。助けてください。
編集:それに応じてオリエンテーションを編集しましたが、アプリを実行すると動作しなくなります。 LogCatで、「指定された子には既に親がいます。最初に子の親でremoveView()を呼び出す必要があります」というエラーを表示します。
これが私のXMLです。
<LinearLayout
Android:id="@+id/new_linearLayoutOuter"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:background="@color/white"
Android:orientation="horizontal" >
<ImageView
Android:id="@+id/new_imageViewPP"
Android:layout_width="55dp"
Android:layout_height="55dp"
Android:layout_marginLeft="14dp"
Android:layout_marginTop="12dp"
Android:background="@color/black"
Android:contentDescription="@string/pp" />
<LinearLayout
Android:id="@+id/new_linearLayoutInner"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:background="@color/white"
Android:orientation="vertical" >
<TextView
Android:id="@+id/new_textView"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="@string/movie_title"
Android:paddingTop="10dp"
Android:paddingLeft="7dp"
Android:textSize="15sp" /> <!-- Title of the movie -->
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="@string/review_by"
Android:paddingTop="3dp"
Android:paddingLeft="7dp"
Android:textSize="12sp" /> <!-- By -->
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="@string/movie_stars"
Android:paddingTop="3dp"
Android:paddingLeft="7dp"
Android:textSize="12sp" /> <!-- Rating and date -->
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="@string/sample_string"
Android:maxLines="5"
Android:scrollbars="vertical"
Android:paddingTop="10dp"
Android:paddingLeft="7dp"
Android:textSize="12sp"
Android:layout_gravity="center_vertical|right" /> <!-- Review content -->
</LinearLayout>
</LinearLayout>
その階層をプログラムで必要とします。
- LinearLayout(horizontal) - ImageView - LinearLayout(vertical) - TextView - TextView - TextView - TextView
[OK]で親LinearLayout
から始めましょう
LinearLayout parent = new LinearLayout(context);
parent.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
parent.setOrientation(LinearLayout.HORIZONTAL);
//children of parent linearlayout
ImageView iv = new ImageView(context);
LinearLayout layout2 = new LinearLayout(context);
layout2.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
layout2.setOrientation(LinearLayout.VERTICAL);
parent.addView(iv);
parent.addView(layout2);
//children of layout2 LinearLayout
TextView tv1 = new TextView(context);
TextView tv2 = new TextView(context);
TextView tv3 = new TextView(context);
TextView tv4 = new TextView(context);
layout2.addView(tv1);
layout2.addView(tv2);
layout2.addView(tv3);
layout2.addView(tv4);
これで完了です。
XMLファイルには、LinearLayoutには既に子ビューがあります。そのため、コードに追加する必要はありません。
xMLファイルを削除し、Java側で完全なコードを使用することをお勧めします。Java側。 xtreemdeveloperが、親レイアウトのいくつかの行を変更します。
// remove this params set it up below
parent.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
// change the code above into
.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
addContentView(parent,layoutParams);
// end of my change
完全なコードでは次のようになります=
LinearLayout parent = new LinearLayout(context);
// remove this params set it up below
parent.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
// change the code above into
.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
addContentView(parent,layoutParams);
// end of my change
parent.setOrientation(LinearLayout.HORIZONTAL);
//children of parent linearlayout
ImageView iv = new ImageView(context);
LinearLayout layout2 = new LinearLayout(context);
layout2.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
layout2.setOrientation(LinearLayout.VERTICAL);
parent.addView(iv);
parent.addView(layout2);
//children of layout2 LinearLayout
TextView tv1 = new TextView(context);
TextView tv2 = new TextView(context);
TextView tv3 = new TextView(context);
TextView tv4 = new TextView(context);
layout2.addView(tv1);
layout2.addView(tv2);
layout2.addView(tv3);
layout2.addView(tv4);
問題は、ビューが既にXML
ファイルのレイアウトに追加されているためです。次に、findViewById
(それらを見つけて)レイアウトに再度追加します。ビューが既に親を持っているため、再度追加することはできないという不満を言ってアプリがクラッシュします。