20

Is there any difference between @null Vs transparent(#00000000)

in my layout I set android:background"@color/transparent" but its showing some other different background color that I used.

when I used null its working fine.

I want to set @null thru programmatic.

how to do?

Padma Kumar
  • 19,893
  • 17
  • 73
  • 130

4 Answers4

19

@null means no background at all (View.getBackground() returns null).

#00000000 means that you got a ColorDrawable as the background which has a fully-transparent color.

I didn't look at the code, but I guess that the framework tests if the ColorDrawable is fully transparent and does not draw it in this case. Otherwise you would have some drawing overhead, making @null the faster choice. Both should look identical, so not sure if this is your underlying isse.

To set the equivalent of @null in code, use View.setBackgroundDrawable(null).

10

Yes, there is.

  • @null means no background.
  • #00000000 means add a transparent background.

If you will not have a background make it @null it should perform better. To use @null from the code you can try doing:

widget.setBackgroundDrawable(null);
Macarse
  • 91,829
  • 44
  • 175
  • 230
2

I would say, in most circumstances prefer @null background over @android:color/transparent.

In code, use setBackground(null) which calls a deprecated method setBackgroundDrawable();

If you look at the View.setBackgroundDrawable(), you will notice that if you pass null as background it will set the flags to SKIP_DRAW and that's it. On other hand, if there is a drawable object, it will go through extra process to set up background padding.

Here is the code of setBackgroundDrawable (Note: use setBackground instead of setBackgroundDrawable)

   public void setBackgroundDrawable(Drawable background) {
    computeOpaqueFlags();

    if (background == mBackground) {
        return;
    }

    boolean requestLayout = false;

    mBackgroundResource = 0;

    /*
     * Regardless of whether we're setting a new background or not, we want
     * to clear the previous drawable.
     */
    if (mBackground != null) {
        mBackground.setCallback(null);
        unscheduleDrawable(mBackground);
    }

    if (background != null) {
        Rect padding = sThreadLocal.get();
        if (padding == null) {
            padding = new Rect();
            sThreadLocal.set(padding);
        }
        resetResolvedDrawables();
        background.setLayoutDirection(getLayoutDirection());
        if (background.getPadding(padding)) {
            resetResolvedPadding();
            switch (background.getLayoutDirection()) {
                case LAYOUT_DIRECTION_RTL:
                    mUserPaddingLeftInitial = padding.right;
                    mUserPaddingRightInitial = padding.left;
                    internalSetPadding(padding.right, padding.top, padding.left, padding.bottom);
                    break;
                case LAYOUT_DIRECTION_LTR:
                default:
                    mUserPaddingLeftInitial = padding.left;
                    mUserPaddingRightInitial = padding.right;
                    internalSetPadding(padding.left, padding.top, padding.right, padding.bottom);
            }
            mLeftPaddingDefined = false;
            mRightPaddingDefined = false;
        }

        // Compare the minimum sizes of the old Drawable and the new.  If there isn't an old or
        // if it has a different minimum size, we should layout again
        if (mBackground == null || mBackground.getMinimumHeight() != background.getMinimumHeight() ||
                mBackground.getMinimumWidth() != background.getMinimumWidth()) {
            requestLayout = true;
        }

        background.setCallback(this);
        if (background.isStateful()) {
            background.setState(getDrawableState());
        }
        background.setVisible(getVisibility() == VISIBLE, false);
        mBackground = background;

        if ((mPrivateFlags & PFLAG_SKIP_DRAW) != 0) {
            mPrivateFlags &= ~PFLAG_SKIP_DRAW;
            mPrivateFlags |= PFLAG_ONLY_DRAWS_BACKGROUND;
            requestLayout = true;
        }
    } else {
        /* Remove the background */
        mBackground = null;

        if ((mPrivateFlags & PFLAG_ONLY_DRAWS_BACKGROUND) != 0) {
            /*
             * This view ONLY drew the background before and we're removing
             * the background, so now it won't draw anything
             * (hence we SKIP_DRAW)
             */
            mPrivateFlags &= ~PFLAG_ONLY_DRAWS_BACKGROUND;
            mPrivateFlags |= PFLAG_SKIP_DRAW;
        }

        /*
         * When the background is set, we try to apply its padding to this
         * View. When the background is removed, we don't touch this View's
         * padding. This is noted in the Javadocs. Hence, we don't need to
         * requestLayout(), the invalidate() below is sufficient.
         */

        // The old background's minimum size could have affected this
        // View's layout, so let's requestLayout
        requestLayout = true;
    }

    computeOpaqueFlags();

    if (requestLayout) {
        requestLayout();
    }

    mBackgroundSizeChanged = true;
    invalidate(true);
}
Laimiux
  • 533
  • 5
  • 13
2

set 0 in background.

view.setBackgroundColor(0);
jeet
  • 29,001
  • 6
  • 52
  • 53