Zach
Zach

Reputation: 10129

Add fragment as Subview in android

I have a fragment which has a horizontal scrollview. I want to add another fragment to this scrollview. How can I do that?

Here is my first fragment

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="wrap_content"
    android:layout_height="220dp"
    android:background="@drawable/arrow_bg">

    <HorizontalScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/horizontalScrollView"
        android:layout_marginTop="15dp" >

        <LinearLayout
            android:id="@+id/offerLayout"
            android:orientation="horizontal"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"></LinearLayout>
    </HorizontalScrollView>
</LinearLayout>

I am trying to add the below fragment to the scrollview

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="174dp"
    android:layout_height="214dp">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="HEALTH"
        android:id="@+id/offerTitle"
        android:capitalize="characters" />

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/offer_image_text_bg">

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="135dp"
            android:id="@+id/offerIcon"
            android:src="@drawable/health_img"/>

        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">

            <LinearLayout
                android:id="@+id/favLayout"
                android:orientation="horizontal"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content">

                <RatingBar
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:id="@+id/ratingBar"
                    android:numStars="5"
                    android:rating="4"
                    android:isIndicator="true"
                    android:layout_marginTop="5dp"
                    android:layout_marginLeft="5dp"
                    style="@style/ratingBarStyle"/>

                <RelativeLayout
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content">
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="5dp"
                        android:layout_marginRight="5dp"
                        android:id="@+id/favIcon"
                        android:src="@drawable/like_icon"
                        android:layout_alignParentRight="true"/>
                    </RelativeLayout>


            </LinearLayout>

            <LinearLayout
                android:layout_below="@+id/favLayout"
                android:orientation="vertical"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent">

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textAppearance="?android:attr/textAppearanceMedium"
                    android:text="Medium Text"
                    android:id="@+id/txt_OfferTitle2" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textAppearance="?android:attr/textAppearanceSmall"
                    android:text="Small Text"
                    android:id="@+id/txt_OfferDesc" />
            </LinearLayout>
        </RelativeLayout>

    </LinearLayout>

</LinearLayout>

This is the code I am using for the same

private void loadSelectedOffers() {
        for(int i=0;i<3;i++)
        {
            OfferItemFragment offerItem = new OfferItemFragment();
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT);
            offerItem.getView().setLayoutParams(params);
            offerLayout.addView(offerItem.getView());
        }
    }

But I am getting a null pointer exception at line

offerItem.getView()

How can I do this properly?

Upvotes: 0

Views: 991

Answers (2)

user3331142
user3331142

Reputation: 1262

Add a FrameLayout to your first fragment and then add the fragment to that framelayout.

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/parent"
    android:orientation="vertical" android:layout_width="wrap_content"
    android:layout_height="220dp"
    android:background="#468494">

    <HorizontalScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/horizontalScrollView"
        android:background="#BB099D"
        android:layout_marginTop="15dp" >

        <LinearLayout
            android:id="@+id/child"
            android:orientation="horizontal" 
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/black">
         </LinearLayout>

    </HorizontalScrollView>
</LinearLayout>

Then in your code add the fragment to the view using FragmentManager and FragmentTransaction

public class MainActivity extends Activity {

Fragment f;
EditText send;
LinearLayout parent;
LinearLayout child;
HorizontalScrollView scroll;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
    ViewGroup vg = (LinearLayout) inflater.inflate(R.layout.activity_main, null );

    child = (LinearLayout) vg.findViewById(R.id.child);
    loadSelectedOffers();
    setContentView(vg);

}


private void loadSelectedOffers() {
    for(int i=0;i<3;i++)
    {
        FrameLayout frame = new FrameLayout(this);
        child.addView(frame);
        frame.setId(i);
        frame.setBackgroundColor(getResources().getColor(R.color.black));
        frame.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

        FragmentManager manager = getFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        SenderFragment offerItem = new SenderFragment();
        transaction.add(i, offerItem, "offer_item_" );
        transaction.commit();



    }
}

I believe something like this should work now.

Upvotes: 1

Abhishek Shukla
Abhishek Shukla

Reputation: 1242

You are getting view null because its onCreateView() has not been executed yet, that in turn is because you have merely instantiated the fragment and not attached it to your activity. Try adding FrameLayouts in your HSV and replacing them by the fragments.

Upvotes: 1

Related Questions