1

I have a LinearLayout in which a TextView's visibility and background (GradientDrawable) changes according to a function myFunction():

<LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:layout_weight="1"
        android:animateLayoutChanges="true"
        android:gravity="center"
        android:orientation="vertical" >


    (...Some views...)


    <TextView
            android:id="@+id/currentPercentage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginTop="10dp"
            android:gravity="center"
            android:paddingLeft="5dp"
            android:paddingRight="5dp"
            android:singleLine="true"
            android:text="XX.X%"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:textColor="@color/White" />

</LinearLayout>

The currentPercentage TextView has GONE visibility by default and, according to some events in the fragment that contains it, may have it changed to Visible (or back to GONE) and its background to a different GradientDrawable like so:

myFunction(...){

    TextView currentPercentage= (TextView) getView().findViewById(R.id.currentPercentage);

    if(condition ... ) {

        Color color = // Color based on the condition...
        GradientDrawable gd = new GradientDrawable(
            GradientDrawable.Orientation.TL_BR,
            new int[] {color,color});
        DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
        int dp = Math.round(10f / (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
        gd.setCornerRadius(dp);
        currentChartPercentage.setBackground(gd);

    } else if( otherCondition...)
    {
        // ... similar stuff ...
    } else {
        // Hide the currentPercentage TextView
        currentPercentage.setVisibility(View.GONE);
    }
}

This works fine as the TextView's background and visibility change smoothly whenever myFunction() is called and the other elements in the LinearLayout move (with animation) to make room for the TextView.

My issue is that whenever the visibility goes from GONE to VISIBLE, the View fades in nicely (as expected because of android:animateLayoutChanges="true") but right in the end shows up with an annoying black background where the GradientDrawable round corners are (see image).

Annoying Black Background

Right after that, if I touch something else or drag the fragment (it's inside a ViewPager), the black background disappears. If myFunction() is called again, with the View already VISIBLE, then the background color changes as desired with no black background.

Also, if I disable the animation, I don't get the black background too. Thus, the problem seems to be related to the visibility going from GONE to VISIBLE with an animation.

Round Corners OK

This behavior is obtained on an emulator with Android 4.3 and I haven't tested it on my real device yet.

Does anybody have a clue on why this may be happening?

EDIT:

Just tested this on a real device with ICS without any issue.

EDIT 2:

I once had a problem with an undesirable background showing up in a ListView similar to Background ListView becomes black when scrolling but in this case, setting a cacheColorHint does nothing.

Community
  • 1
  • 1
user1987392
  • 3,921
  • 4
  • 34
  • 59

0 Answers0