Search code examples
javaandroidxmltextviewandroid-linearlayout

Android: LinearLayout.addView not rendering added views


I'm trying to add two text views to a LinearLayout programmatically (in a loop), and then in turn adding that to a LinearLayout that's defined in the layout file. The code runs with no errors, and when evaluating getChildCount I get the expected value, but absolutely nothing is rendering on the device.

XML:

<LinearLayout
        android:id="@+id/llNotes"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="1dp"
        android:layout_marginLeft="1dp"
        android:layout_marginEnd="1dp"
        android:layout_marginRight="1dp"
        android:layout_marginBottom="@dimen/activity_vertical_margin_quarter"
        android:background="@drawable/rounded_bottom_corners"
        android:orientation="vertical"
        android:paddingTop="@dimen/activity_vertical_margin_half"
        android:paddingBottom="@dimen/activity_vertical_margin" />

Java:

for (Note MyNote : foo.GetNotes()) {
            LinearLayout llNoteParent = new LinearLayout(this);
            TextView tvNoteHeader = new TextView(this);
            TextView tvNoteValue = new TextView(this);

            LinearLayout.LayoutParams llParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
            llParams.gravity = Gravity.CENTER_HORIZONTAL;
            llNoteParent.setLayoutParams(llParams);
            llNoteParent.setOrientation(LinearLayout.HORIZONTAL);
            llNoteParent.setBackgroundColor(ContextCompat.getColor(this, R.color.white));
            llNoteParent.setPadding(R.dimen.activity_horizontal_margin, R.dimen.activity_vertical_margin_half, R.dimen.activity_horizontal_margin, R.dimen.activity_horizontal_margin);

            LinearLayout.LayoutParams tvNoteHeaderParams = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT);
            tvNoteHeaderParams.weight = 1;
            tvNoteHeader.setLayoutParams(tvNoteHeaderParams);
            tvNoteHeader.setPadding(R.dimen.activity_vertical_margin_half, R.dimen.activity_vertical_margin_half, R.dimen.activity_vertical_margin_half, R.dimen.activity_vertical_margin_half);
            tvNoteHeader.setBackground(getDrawable(R.drawable.left_text_field));
            tvNoteHeader.setGravity(Gravity.CENTER);
            tvNoteHeader.setText(MyNote.GetAbbreviatedText());

            LinearLayout.LayoutParams tvNoteValueParams = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT);
            tvNoteValueParams.weight = 1;
            tvNoteValue.setLayoutParams(tvNoteValueParams);
            tvNoteValue.setPadding(R.dimen.activity_vertical_margin_half, R.dimen.activity_vertical_margin_half, R.dimen.activity_vertical_margin_half, R.dimen.activity_vertical_margin_half);
            tvNoteValue.setBackground(getDrawable(R.drawable.right_text_field));
            tvNoteValue.setText(MyNote.GetText());

            llNoteParent.addView(tvNoteHeader);
            llNoteParent.addView(tvNoteValue);
            llNotes.addView(llNoteParent);
        }

Solution

  • you cannot pass number with dp into setPadding method

    setPadding(R.dimen.activity_horizontal_margin, R.dimen.activity_vertical_margin_half, R.dimen.activity_horizontal_margin, R.dimen.activity_horizontal_margin);
    

    you need to pass integers into setPadding method.

    1- try something like this

    llNoteParent.setPadding(20,20,20,20);
    tvNoteHeader.setPadding(20,20,20,20);
    

    2- OR user integer.xml

         for (Note MyNote : foo.GetNotes()) {
                    LinearLayout llNoteParent = new LinearLayout(this);
                    TextView tvNoteHeader = new TextView(this);
                    TextView tvNoteValue = new TextView(this);
    
                    LinearLayout.LayoutParams llParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
                    llParams.gravity = Gravity.CENTER_HORIZONTAL;
                    llNoteParent.setLayoutParams(llParams);
                    llNoteParent.setOrientation(LinearLayout.HORIZONTAL);
                    llNoteParent.setBackgroundColor(ContextCompat.getColor(this, R.color.white));
                    llNoteParent.setPadding(R.integer.activity_horizontal_margin, R.integer.activity_vertical_margin_half, R.integer.activity_horizontal_margin, R.integer.activity_horizontal_margin);
    
                    LinearLayout.LayoutParams tvNoteHeaderParams = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT);
                    tvNoteHeaderParams.weight = 1;
                    tvNoteHeader.setLayoutParams(tvNoteHeaderParams);
                    tvNoteHeader.setPadding(R.integer.activity_vertical_margin_half, R.integer.activity_vertical_margin_half, R.integer.activity_vertical_margin_half, R.integer.activity_vertical_margin_half);
                    tvNoteHeader.setBackground(getDrawable(R.drawable.left_text_field));
                    tvNoteHeader.setGravity(Gravity.CENTER);
                    tvNoteHeader.setText(MyNote.GetAbbreviatedText());
    
                    LinearLayout.LayoutParams tvNoteValueParams = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT);
                    tvNoteValueParams.weight = 1;
                    tvNoteValue.setLayoutParams(tvNoteValueParams);
                    tvNoteValue.setPadding(R.integer.activity_vertical_margin_half, R.integer.activity_vertical_margin_half, R.integer.activity_vertical_margin_half, R.integer.activity_vertical_margin_half);
                    tvNoteValue.setBackground(getDrawable(R.drawable.right_text_field));
                    tvNoteValue.setText(MyNote.GetText());
    
                    llNoteParent.addView(tvNoteHeader);
                    llNoteParent.addView(tvNoteValue);
                    llNotes.addView(llNoteParent);
     }
    

    NOTE: Add the values to integer.xml file in values.