1

以下のルールを追加してTextViewを別のものの下に配置しようとしていますが、プログラムで行うことはできません。 以下のレイアウトパラメータはプログラムでは機能しません

 <android.support.v7.widget.CardView 
      xmlns:card_view="http://schemas.android.com/apk/res-auto" 
      android:id="@+id/card_view" 
      android:layout_gravity="center" 
      android:layout_width="match_parent" 
      android:layout_height="200dp" 
      card_view:cardCornerRadius="4dp" 
      card_view:cardBackgroundColor="#00bcd4"> 

      <RelativeLayout 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:paddingBottom="@dimen/activity_vertical_margin" 
       android:paddingLeft="@dimen/activity_horizontal_margin" 
       android:paddingRight="@dimen/activity_horizontal_margin" 
       android:paddingTop="@dimen/activity_vertical_margin"> 

       <TextView 
        android:id="@+id/info_text" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="Category Name" 
        style="@style/Base.TextAppearance.AppCompat.Title" 
        android:paddingBottom="@dimen/activity_vertical_margin" 
        android:layout_centerHorizontal="true" /> 

       <TextView 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:text="Vel voluptatem soluta ipsa. Voluptatem est quod non explicabo aut quisquam quas. Voluptatem aliquam iure voluptas" 
        android:id="@+id/textView" 
        android:paddingBottom="@dimen/activity_vertical_margin" 
        android:layout_below="@+id/info_text" 
        android:layout_above="@+id/button"/> 

       <Button 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="Help" 
        android:id="@+id/button" 
        android:layout_alignParentBottom="true" 
        android:layout_alignParentEnd="true" /> 

       <Button 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="Play" 
        android:id="@+id/button2" 
        android:layout_alignParentBottom="true" 
        android:layout_alignParentStart="true" /> 

      </RelativeLayout> 
     </android.support.v7.widget.CardView> 

    </LinearLayout> 

そして、これが正常に動作します: 私はこのようなXMLを持っています!私はちょうど私が望む結果を得た:カテゴリ名、説明、2つのボタンを持つCardView。
私は表示するカテゴリが多いので、このXMLをJavaで転置しようとしました。

LinearLayout linearLayoutCategory = (LinearLayout) findViewById(R.id.linearLayoutCategory); 
    for (int i = 0; i < categories.size(); i++) { 
     Category category = categories.get(i); 
     CardView cardView = new CardView(this); 
     cardView.setCardBackgroundColor(Color.parseColor("#00bcd4")); 
     cardView.setRadius((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4, getResources().getDisplayMetrics())); 
     LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 200, getResources().getDisplayMetrics()), Gravity.CENTER); 
     layoutParams.setMargins(0, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 16, getResources().getDisplayMetrics()), 0, 0); 
     cardView.setLayoutParams(layoutParams); 

     RelativeLayout relativeLayout = new RelativeLayout(this); 
     RelativeLayout.LayoutParams layoutParams1 = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT); 
     relativeLayout.setLayoutParams(layoutParams1); 

     TextView textView = new TextView(this); 
     RelativeLayout.LayoutParams layoutParams2 = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
     layoutParams2.addRule(RelativeLayout.CENTER_HORIZONTAL); 
     textView.setLayoutParams(layoutParams2); 
     textView.setText(category.getName()); 
     textView.setTextAppearance(this, android.R.style.TextAppearance_Large); 
     textView.setId(i); 
     relativeLayout.addView(textView); 

     TextView textView1 = new TextView(this); 
     RelativeLayout.LayoutParams layoutParams3 = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT); 
     layoutParams3.addRule(RelativeLayout.BELOW, textView.getId()); 
     textView1.setLayoutParams(layoutParams3); 
     textView1.setText(category.getDescription()); 
     relativeLayout.addView(textView1); 

     Button button = new Button(this); 
     relativeLayout.addView(button); 

     Button button1 = new Button(this); 
     relativeLayout.addView(button1); 

     cardView.addView(relativeLayout); 
     linearLayoutCategory.addView(cardView); 
    } 

これは良い位置付けカテゴリ名(のTextView)でCardViewの多くを作成しますが、私はカテゴリの説明を配置するために管理することはできません。私はこのようでした。この行は、(カテゴリの説明に相当)textView1への影響を持って見ていません:追加ルール:

 layoutParams3.addRule(RelativeLayout.BELOW, textView.getId()); 

カテゴリ名が位置良いですし、私は同じ技術を使用しているため、私は理解していません。
私は何かを忘れましたか、間違っていましたか?
ここにはpictureという2つの結果が表示されます
ありがとうございます。

答えて

2

問題はあなたのルールがTextViewのIDに基づいていることである。

layoutParams3.addRule(RelativeLayout.BELOW, textView.getId()); 

しかし、あなたが作成するので、あなたのTextViewコードから、それはそれに割り当てられたIDを持っていません。 XMLではTextViewにidがandroid:id="@+id/info_text"であるため、XMLで正常に動作します。

XMLレイアウトをコードに変換する必要はありません。必要なものは、各カテゴリのレイアウトを膨らませてコンテナに結果を追加するだけです(カテゴリにコンテナとして垂直のLinearLayoutを使用すると思います) :

main_layout:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/linearLayoutCategory" 
      android:orientation="vertical" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 

category.xml:

<?xml version="1.0" encoding="utf-8"?> 
    <android.support.v7.widget.CardView 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:card_view="http://schemas.android.com/apk/res-auto" 
     android:id="@+id/card_view" 
     android:layout_gravity="center" 
     android:layout_width="match_parent" 
     android:layout_height="200dp" 
     card_view:cardCornerRadius="4dp" 
     card_view:cardBackgroundColor="#00bcd4"> 

     <RelativeLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:paddingBottom="@dimen/activity_vertical_margin" 
      android:paddingLeft="@dimen/activity_horizontal_margin" 
      android:paddingRight="@dimen/activity_horizontal_margin" 
      android:paddingTop="@dimen/activity_vertical_margin"> 

      <TextView 
       android:id="@+id/info_text" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="Category Name" 
       style="@style/Base.TextAppearance.AppCompat.Title" 
       android:paddingBottom="@dimen/activity_vertical_margin" 
       android:layout_centerHorizontal="true" /> 

      <TextView 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:text="Vel voluptatem soluta ipsa. Voluptatem est quod non explicabo aut quisquam quas. Voluptatem aliquam iure voluptas" 
       android:id="@+id/textView" 
       android:paddingBottom="@dimen/activity_vertical_margin" 
       android:layout_below="@+id/info_text" 
       android:layout_above="@+id/button"/> 

      <Button 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="Help" 
       android:id="@+id/button" 
       android:layout_alignParentBottom="true" 
       android:layout_alignParentEnd="true" /> 

      <Button 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="Play" 
       android:id="@+id/button2" 
       android:layout_alignParentBottom="true" 
       android:layout_alignParentStart="true" /> 

     </RelativeLayout> 
    </android.support.v7.widget.CardView> 

ビジネス・ロジック:

LinearLayout linearLayoutCategory = (LinearLayout)findViewById(R.id.linearLayoutCategory); 
for (int i = 0; i < categories.size(); i++) { 
    View category = getLayoutInflater().inflate(R.layout.category, linearLayoutCategory, false); 

    TextView infoText = category.findViewById(R.id.info_text); 
    infoText.setText(/*category name?*/); 

    linearLayoutCategory.addView(category); 
} 
関連する問題