gabi gabi - 4 months ago 21
Android Question

Inflating RelativeLayout View into horizontal scroll view deletes layout settings

Sorry for the long question..

I have Relativelayout of elements I am adding dynamically into Linearlayout of Horizontalscrollview.

When I see the layout the preview seems great, but when I am adding it programmatically it ruins the view.. the Text moved to another locations on the layout, and the padding is ignored..

This is the Relativelayout element deal_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="310dp"
android:layout_height="wrap_content"
android:layout_marginEnd="15dp"
android:layout_marginRight="15dp"
android:id="@+id/deal_layout"
>
<ImageView
android:layout_width="310dp"
android:layout_height="130dp"
android:src="@drawable/deal_square"
android:layout_centerVertical="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:contentDescription="deals background" />

<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:paddingTop="25dp"
android:id="@+id/from_to_deals_txt"
>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="from "
android:textAppearance="@style/from_to_deals"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Source"
android:textAppearance="@style/source_deals"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=" to "
android:textAppearance="@style/from_to_deals"
/>
</LinearLayout>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="destination"
android:textAppearance="@style/dst_deals"
android:layout_below="@id/from_to_deals_txt"
android:layout_alignRight="@id/from_to_deals_txt"
android:paddingTop="10dp"
android:id="@+id/dst_deals_txt"
/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1099 X"
android:textAppearance="@style/price_deals"
android:layout_below="@id/dst_deals_txt"
android:layout_alignRight="@id/from_to_deals_txt"
android:layout_alignEnd="@id/from_to_deals_txt"
android:paddingTop="10dp"
android:id="@+id/price_deal_txt"
/>

<ImageView
android:layout_width="150dp"
android:layout_height="150dp"
android:src="@drawable/ic_launcher"
android:background="#000000"
android:layout_marginLeft="10dp"
android:layout_marginStart="10dp"
/>
</RelativeLayout>


This is the Horizontal scroll view:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:background="@drawable/bg"
android:padding="10dp">
<HorizontalScrollView
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/dealsView"
android:paddingTop="10dp"
>

</LinearLayout>
</HorizontalScrollView>
</LinearLayout>


I am adding the Relativelayout elements with this java function:

LinearLayout dealsView;
dealsView = (LinearLayout)findViewById(R.id.dealsView);
for(int i=0;i<5;i++)
{
LayoutInflater mInflater ;
mInflater = LayoutInflater.from(this);
View cur_deal = mInflater.inflate(R.layout.deal_layout, null);
dealsView.addView(cur_deal);
}


In the preview it looks like this:

enter image description here

On the application it looks like this:

enter image description here

Does anyone has idea what am I doing wrong?

When I am adding the elements with copy paste to the linearlayout it seems great, and the margin is works fine, only from the code it not works..

Thanks!

Answer

Instead of passing null to the inflater, pass the Views intended parent (dealsView) so that the LayoutParams from the root can be used to inflate.

View cur_deal = mInflater.inflate(R.layout.deal_layout, dealsView, false);

I believe the issue is caused by all of your Views using width="wrap_content" but without the inflater knowing the root it cannot properly inflate that value.