android - Tab strip disappears on setting background color -


i have made tab view, want change background color of tabs, when set color on tab textview background, strip disappears.

slidingtablayout.java

    package com.towntrot.checkin;  import android.content.context; import android.graphics.color; import android.graphics.typeface; import android.os.build; import android.support.v4.view.pageradapter; import android.support.v4.view.viewpager; import android.util.attributeset;           import android.util.typedvalue; import android.view.gravity; import android.view.layoutinflater; import android.view.view; import android.widget.horizontalscrollview; import android.widget.textview; import android.widget.toast;  public class slidingtablayout extends horizontalscrollview {  public interface tabcolorizer {      int getindicatorcolor(int position);      int getdividercolor(int position);  }  private static final int title_offset_dips = 24; private static final int tab_view_padding_dips = 16; private static final int tab_view_text_size_sp = 12;  private int mtitleoffset;  private int mtabviewlayoutid; private int mtabviewtextviewid;  private viewpager mviewpager; private viewpager.onpagechangelistener mviewpagerpagechangelistener;  private final slidingtabstrip mtabstrip;  public slidingtablayout(context context) {     this(context, null); }  public slidingtablayout(context context, attributeset attrs) {     this(context, attrs, 0); }  public slidingtablayout(context context, attributeset attrs, int defstyle) {     super(context, attrs, defstyle);      sethorizontalscrollbarenabled(false);     setfillviewport(true);      mtitleoffset = (int) (title_offset_dips * getresources().getdisplaymetrics().density);      mtabstrip = new slidingtabstrip(context);     addview(mtabstrip, layoutparams.match_parent, layoutparams.wrap_content); }  public void setviewpager(viewpager viewpager) {     mtabstrip.removeallviews();      mviewpager = viewpager;     if (viewpager != null) {         viewpager.setonpagechangelistener(new internalviewpagerlistener());         populatetabstrip();     } }  protected textview createdefaulttabview(context context) {     textview textview = new textview(context);     textview.setgravity(gravity.center);     textview.settextcolor(getresources().getcolor(android.r.color.white));     textview.settextsize(typedvalue.complex_unit_sp, tab_view_text_size_sp);     textview.settypeface(typeface.default_bold);     textview.setbackgroundcolor(getresources().getcolor(android.r.color.holo_orange_dark));      if (build.version.sdk_int >= build.version_codes.honeycomb) {         typedvalue outvalue = new typedvalue();         getcontext().gettheme().resolveattribute(android.r.attr.selectableitembackground,                 outvalue, true);     }          if (build.version.sdk_int >= build.version_codes.ice_cream_sandwich) {         // if we're running on ics or newer, enable all-caps match action bar tab style         textview.setallcaps(true);     }      int padding = (int) (tab_view_padding_dips * getresources().getdisplaymetrics().density);     textview.setpadding(padding, padding, padding, padding);      return textview; }  private void populatetabstrip() {     final pageradapter adapter = mviewpager.getadapter();     final view.onclicklistener tabclicklistener = new tabclicklistener();      (int = 0; < adapter.getcount(); i++) {         view tabview = null;         textview tabtitleview = null;          if (mtabviewlayoutid != 0) {             // if there custom tab view layout id set, try , inflate             tabview = layoutinflater.from(getcontext()).inflate(mtabviewlayoutid, mtabstrip,                     false);             tabtitleview = (textview) tabview.findviewbyid(mtabviewtextviewid);         }          if (tabview == null) {             tabview = createdefaulttabview(getcontext());         }          if (tabtitleview == null && textview.class.isinstance(tabview)) {             tabtitleview = (textview) tabview;         }          tabtitleview.settext(adapter.getpagetitle(i));         tabview.setonclicklistener(tabclicklistener);          mtabstrip.addview(tabview);     } }  @override protected void onattachedtowindow() {     super.onattachedtowindow();      if (mviewpager != null) {         scrolltotab(mviewpager.getcurrentitem(), 0);     } }  private void scrolltotab(int tabindex, int positionoffset) {     final int tabstripchildcount = mtabstrip.getchildcount();     if (tabstripchildcount == 0 || tabindex < 0 || tabindex >= tabstripchildcount) {         return;     }      view selectedchild = mtabstrip.getchildat(tabindex);     if (selectedchild != null) {         int targetscrollx = selectedchild.getleft() + positionoffset;          if (tabindex > 0 || positionoffset > 0) {             // if we're not @ first child , mid-scroll, make sure obey offset             targetscrollx -= mtitleoffset;         }          scrollto(targetscrollx, 0);     } }  private class internalviewpagerlistener implements viewpager.onpagechangelistener {     private int mscrollstate;      @override     public void onpagescrolled(int position, float positionoffset, int positionoffsetpixels) {         int tabstripchildcount = mtabstrip.getchildcount();         if ((tabstripchildcount == 0) || (position < 0) || (position >= tabstripchildcount)) {             return;         }          mtabstrip.onviewpagerpagechanged(position, positionoffset);          view selectedtitle = mtabstrip.getchildat(position);         int extraoffset = (selectedtitle != null)                 ? (int) (positionoffset * selectedtitle.getwidth())                 : 0;         scrolltotab(position, extraoffset);          if (mviewpagerpagechangelistener != null) {             mviewpagerpagechangelistener.onpagescrolled(position, positionoffset,                     positionoffsetpixels);         }     }      @override     public void onpagescrollstatechanged(int state) {         mscrollstate = state;          if (mviewpagerpagechangelistener != null) {             mviewpagerpagechangelistener.onpagescrollstatechanged(state);         }     }      @override     public void onpageselected(int position) {         if (mscrollstate == viewpager.scroll_state_idle) {             mtabstrip.onviewpagerpagechanged(position, 0f);             scrolltotab(position, 0);         }          if (mviewpagerpagechangelistener != null) {             mviewpagerpagechangelistener.onpageselected(position);         }     }  }  private class tabclicklistener implements view.onclicklistener {     @override     public void onclick(view v) {         (int = 0; < mtabstrip.getchildcount(); i++) {             if (v == mtabstrip.getchildat(i)) {                 mviewpager.setcurrentitem(i);                 return;             }         }     } }  } 

slidingtabstrip.java

    package com.towntrot.checkin;  import android.r; import android.content.context; import android.graphics.canvas; import android.graphics.color; import android.graphics.paint; import android.util.attributeset; import android.util.typedvalue; import android.view.view; import android.widget.linearlayout;  class slidingtabstrip extends linearlayout {  private static final int default_bottom_border_thickness_dips = 2; private static final byte default_bottom_border_color_alpha = 0x26; private static final int selected_indicator_thickness_dips = 4; private static final int default_selected_indicator_color = 0xffee7600;  private static final int default_divider_thickness_dips = 1; private static final byte default_divider_color_alpha = 0x20; private static final float default_divider_height = 0.5f;  private final int mbottomborderthickness; private final paint mbottomborderpaint;  private final int mselectedindicatorthickness; private final paint mselectedindicatorpaint;  private final int mdefaultbottombordercolor;  private final paint mdividerpaint; private final float mdividerheight;  private int mselectedposition; private float mselectionoffset;  private slidingtablayout.tabcolorizer mcustomtabcolorizer; private final simpletabcolorizer mdefaulttabcolorizer;  slidingtabstrip(context context) {     this(context, null); }  slidingtabstrip(context context, attributeset attrs) {     super(context, attrs);     setwillnotdraw(false);      final float density = getresources().getdisplaymetrics().density;      typedvalue outvalue = new typedvalue();     context.gettheme().resolveattribute(r.attr.colorforeground, outvalue, true);     final int themeforegroundcolor =  getresources().getcolor(android.r.color.holo_orange_dark);      mdefaultbottombordercolor = setcoloralpha(themeforegroundcolor,             default_bottom_border_color_alpha);      mdefaulttabcolorizer = new simpletabcolorizer();     mdefaulttabcolorizer.setindicatorcolors(default_selected_indicator_color);     mdefaulttabcolorizer.setdividercolors(setcoloralpha(themeforegroundcolor,             default_divider_color_alpha));      mbottomborderthickness = (int) (default_bottom_border_thickness_dips * density);     mbottomborderpaint = new paint();     mbottomborderpaint.setcolor(mdefaultbottombordercolor);      mselectedindicatorthickness = (int) (selected_indicator_thickness_dips * density);     mselectedindicatorpaint = new paint();      mdividerheight = default_divider_height;     mdividerpaint = new paint();     mdividerpaint.setstrokewidth((int) (default_divider_thickness_dips * density)); }  void onviewpagerpagechanged(int position, float positionoffset) {     mselectedposition = position;     mselectionoffset = positionoffset;     invalidate(); }  @override protected void ondraw(canvas canvas) {     final int height = getheight();     final int childcount = getchildcount();     final int dividerheightpx =0;     final slidingtablayout.tabcolorizer tabcolorizer = mcustomtabcolorizer != null             ? mcustomtabcolorizer             : mdefaulttabcolorizer;      // thick colored underline below current selection     if (childcount > 0) {         view selectedtitle = getchildat(mselectedposition);         int left = selectedtitle.getleft();         int right = selectedtitle.getright();         int color = tabcolorizer.getindicatorcolor(mselectedposition);          if (mselectionoffset > 0f && mselectedposition < (getchildcount() - 1)) {             int nextcolor = tabcolorizer.getindicatorcolor(mselectedposition + 1);             if (color != nextcolor) {                 color = blendcolors(nextcolor, color, mselectionoffset);             }              // draw selection partway between tabs             view nexttitle = getchildat(mselectedposition + 1);             left = (int) (mselectionoffset * nexttitle.getleft() +                     (1.0f - mselectionoffset) * left);             right = (int) (mselectionoffset * nexttitle.getright() +                     (1.0f - mselectionoffset) * right);         }          mselectedindicatorpaint.setcolor(color);          canvas.drawrect(left, height - mselectedindicatorthickness, right,                 height, mselectedindicatorpaint);     }      // thin underline along entire bottom edge     canvas.drawrect(0, height - mbottomborderthickness, getwidth(), height, mbottomborderpaint);      // vertical separators between titles     int separatortop = (height - dividerheightpx) / 2;     (int = 0; < childcount - 1; i++) {         view child = getchildat(i);         mdividerpaint.setcolor(tabcolorizer.getdividercolor(i));         canvas.drawline(child.getright(), separatortop, child.getright(),                 separatortop + dividerheightpx, mdividerpaint);     } }  private static int setcoloralpha(int color, byte alpha) {     return color.argb(alpha, color.red(color), color.green(color), color.blue(color)); }  private static int blendcolors(int color1, int color2, float ratio) {     final float inverseration = 1f - ratio;     float r = (color.red(color1) * ratio) + (color.red(color2) * inverseration);     float g = (color.green(color1) * ratio) + (color.green(color2) * inverseration);     float b = (color.blue(color1) * ratio) + (color.blue(color2) * inverseration);     return color.rgb((int) r, (int) g, (int) b); }  private static class simpletabcolorizer implements slidingtablayout.tabcolorizer {     private int[] mindicatorcolors;     private int[] mdividercolors;      @override     public final int getindicatorcolor(int position) {         return mindicatorcolors[position % mindicatorcolors.length];     }         @override     public final int getdividercolor(int position) {         return mdividercolors[position % mdividercolors.length];     }      void setindicatorcolors(int... colors) {         mindicatorcolors = colors;     }      void setdividercolors(int... colors) {         mdividercolors = colors;     } } 

}

in createdefaulttabview have added:

textview.setbackgroundcolor(getresources().getcolor(android.r.color.holo_orange_dark));

i new android, appreciated, thank you.

when set background of textview, covers yours slidingtabstrip layout (container of tabs), below in view hierarchy, bottom strips covered textview background.

to change background color of of tabs, should add drawing of background slidingtabstrip.ondraw method. change background of of tabs, can e.g. fill whole tabs container using canvas.drawcolor(int color) method

@override protected void ondraw(canvas canvas) {     final int height = getheight();     final int childcount = getchildcount();     final int dividerheightpx =0;     final slidingtablayout.tabcolorizer tabcolorizer = mcustomtabcolorizer != null             ? mcustomtabcolorizer             : mdefaulttabcolorizer;     canvas.drawcolor(getresources().getcolor(android.r.color.holo_orange_dark));      // thick colored underline below current selection     if (childcount > 0) {         view selectedtitle = getchildat(mselectedposition);         int left = selectedtitle.getleft();         int right = selectedtitle.getright();         int color = tabcolorizer.getindicatorcolor(mselectedposition);          if (mselectionoffset > 0f && mselectedposition < (getchildcount() - 1)) {             int nextcolor = tabcolorizer.getindicatorcolor(mselectedposition + 1);             if (color != nextcolor) {                 color = blendcolors(nextcolor, color, mselectionoffset);             }              // draw selection partway between tabs             view nexttitle = getchildat(mselectedposition + 1);             left = (int) (mselectionoffset * nexttitle.getleft() +                     (1.0f - mselectionoffset) * left);             right = (int) (mselectionoffset * nexttitle.getright() +                     (1.0f - mselectionoffset) * right);         }          mselectedindicatorpaint.setcolor(color);          canvas.drawrect(left, height - mselectedindicatorthickness, right,                 height, mselectedindicatorpaint);     }      // thin underline along entire bottom edge     canvas.drawrect(0, height - mbottomborderthickness, getwidth(), height, mbottomborderpaint);      // vertical separators between titles     int separatortop = (height - dividerheightpx) / 2;     (int = 0; < childcount - 1; i++) {         view child = getchildat(i);         mdividerpaint.setcolor(tabcolorizer.getdividercolor(i));         canvas.drawline(child.getright(), separatortop, child.getright(),                 separatortop + dividerheightpx, mdividerpaint);     } } 

Comments

Popular posts from this blog

powershell Start-Process exit code -1073741502 when used with Credential from a windows service environment -

twig - Using Twigbridge in a Laravel 5.1 Package -

c# - LINQ join Entities from HashSet's, Join vs Dictionary vs HashSet performance -