W3hri W3hri - 6 months ago 38
Android Question

Fragment has default white background on replace() instead of transparent one

I am facing a strange problem while using fragments and just cant figure it out.

When I am replacing fragments inside my MainActivity container, some will keep the desired transparent background, and some will show a default-like white one. I actually want all my fragments to be transparent and 'use' the background assigned to the MainActivity.

For example:
Fragment A: white background

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

<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:src="@drawable/logo"/>

<de.mypackage.uielements.MyButton
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:text="@string/button_text"/>

**<!-- ListView to show news -->**
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:dividerHeight="1dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginBottom="10dp"/>
</LinearLayout>


Fragment B: transparent background

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

<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>


main.xml

<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<!-- Background Image to be set programmatically, transparent being default -->
<ImageView
android:id="@+id/window_background_image_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:background="@android:color/transparent"/>

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent">

<!-- Top ScrollView -->
<de.opwoco.app.android.apptitan.app.utils.HorizontalListView
android:id="@+id/navigation_tab_listview"
android:layout_width="match_parent"
android:layout_height="50dp"
android:visibility="gone"
android:background="@color/navigation_background"/>

<!-- FrameLayout container where all other fragments are placed -->
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent"
android:layout_below="@+id/navigation_tab_listview"/>

</RelativeLayout>

<fragment
android:id="@+id/navigation_drawer"
android:layout_width="@dimen/navigation_drawer_width"
android:layout_height="match_parent"
android:layout_gravity="start"
android:name="de.mypackage.fragment.NavigationDrawerFragment"
tools:layout="@layout/fragment_navigation_drawer"/>

</android.support.v4.widget.DrawerLayout>


Both fragments are replaced by using following snippet:

android.support.v4.app.FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.container, fragment);
transaction.commit();


So my question is:

How can I achieve that all fragments in my container have a transparent background, so that I am always showing the background assigned in the MainActivity?

SMR SMR
Answer

you can use the following property for all your root layouts, views, fragments, containers etc:

android:background="@android:color/transparent"

This should likely work.

[EDIT]

How can I achieve that all fragments in my container have a transparent background, so that I am always showing the background assigned in the MainActivity?

you want to display the background of your activity only and all the views should be transparent.

To achieve this you have to set android:background="@android:color/transparent" for each view other than the MainActivity's backgroud. i.e background for

  • the Fragments
  • their child Views
  • the ListView(s)
  • and ListView's items / childs etc.

In short each view must have a transparant background so that the Activities's background is not overlapped and visible to the user.

Hope this helps.