android - R.attr.colorForeground error from Google I/O SlidingTabStrip.java -


i trying implement tabs application , have added slidingtablayout.java , slidingtabstrip.java google. made sure add setdistributeevenly method within slidingtablayout class.

my problem coming r.attr.colorforeground. getting error 'cannot resolve sysmbol 'colorforeground'.

here the 2 classes these made tabs.

class slidingtabstrip extends linearlayout {   private static final int default_bottom_border_thickness_dips = 0; private static final byte default_bottom_border_color_alpha = 0x26; private static final int selected_indicator_thickness_dips = 3; private static final int default_selected_indicator_color = 0xff33b5e5;   private final int mbottomborderthickness; private final paint mbottomborderpaint;   private final int mselectedindicatorthickness; private final paint mselectedindicatorpaint;   private final int mdefaultbottombordercolor; private final simpletabcolorizer mdefaulttabcolorizer; private int mselectedposition; private float mselectionoffset; private slidingtablayout.tabcolorizer mcustomtabcolorizer;   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 = outvalue.data;       mdefaultbottombordercolor = setcoloralpha(themeforegroundcolor,             default_bottom_border_color_alpha);       mdefaulttabcolorizer = new simpletabcolorizer();     mdefaulttabcolorizer.setindicatorcolors(default_selected_indicator_color);       mbottomborderthickness = (int) (default_bottom_border_thickness_dips * density);     mbottomborderpaint = new paint();     mbottomborderpaint.setcolor(mdefaultbottombordercolor);       mselectedindicatorthickness = (int) (selected_indicator_thickness_dips * density);     mselectedindicatorpaint = new paint(); }  /**  * set alpha value of {@code color} given {@code alpha} value.  */ private static int setcoloralpha(int color, byte alpha) {     return color.argb(alpha, color.red(color), color.green(color), color.blue(color)); }  /**  * blend {@code color1} , {@code color2} using given ratio.  *  * @param ratio of blend. 1.0 return {@code color1}, 0.5 give blend,  *              0.0 return {@code color2}.  */ 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); }  void setcustomtabcolorizer(slidingtablayout.tabcolorizer customtabcolorizer) {     mcustomtabcolorizer = customtabcolorizer;     invalidate(); }  void setselectedindicatorcolors(int... colors) {     // make sure custom colorizer removed     mcustomtabcolorizer = null;     mdefaulttabcolorizer.setindicatorcolors(colors);     invalidate(); }  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 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); }  private static class simpletabcolorizer implements slidingtablayout.tabcolorizer {     private int[] mindicatorcolors;       @override     public final int getindicatorcolor(int position) {         return mindicatorcolors[position % mindicatorcolors.length];     }       void setindicatorcolors(int... colors) {         mindicatorcolors = colors;     } } 

}

public class slidingtablayout extends horizontalscrollview { 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 final slidingtabstrip mtabstrip; private int mtitleoffset;  private int mtabviewlayoutid; private int mtabviewtextviewid; private boolean mdistributeevenly;  private viewpager mviewpager; private sparsearray<string> mcontentdescriptions = new sparsearray<string>(); private viewpager.onpagechangelistener mviewpagerpagechangelistener;  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);      // disable scroll bar     sethorizontalscrollbarenabled(false);     // make sure tab strips fills view     setfillviewport(true);      mtitleoffset = (int) (title_offset_dips * getresources().getdisplaymetrics().density);      mtabstrip = new slidingtabstrip(context);     addview(mtabstrip, layoutparams.match_parent, layoutparams.wrap_content); }  /**  * set custom {@link tabcolorizer} used.  * <p/>  * if require simple custmisation can use  * {@link #setselectedindicatorcolors(int...)} achieve  * similar effects.  */ public void setcustomtabcolorizer(tabcolorizer tabcolorizer) {     mtabstrip.setcustomtabcolorizer(tabcolorizer); }  public void setdistributeevenly(boolean distributeevenly) {     mdistributeevenly = distributeevenly; }  /**  * sets colors used indicating selected tab. these colors treated  * circular array. providing 1 color mean tabs indicated same color.  */ public void setselectedindicatorcolors(int... colors) {     mtabstrip.setselectedindicatorcolors(colors); }  /**  * set {@link viewpager.onpagechangelistener}. when using {@link slidingtablayout}  * required set {@link viewpager.onpagechangelistener} through method.  * layout can update it's scroll position correctly.  *  * @see viewpager#setonpagechangelistener(viewpager.onpagechangelistener)  */ public void setonpagechangelistener(viewpager.onpagechangelistener listener) {     mviewpagerpagechangelistener = listener; }  /**  * set custom layout inflated tab views.  *  * @param layoutresid layout id inflated  * @param textviewid  id of {@link textview} in inflated view  */ public void setcustomtabview(int layoutresid, int textviewid) {     mtabviewlayoutid = layoutresid;     mtabviewtextviewid = textviewid; }  /**  * sets associated view pager. note assumption here pager content  * (number of tabs , tab titles) not change after call has been made.  */ public void setviewpager(viewpager viewpager) {     mtabstrip.removeallviews();      mviewpager = viewpager;     if (viewpager != null) {         viewpager.setonpagechangelistener(new internalviewpagerlistener());         populatetabstrip();     } }  /**  * create default view used tabs. called if custom tab view not set via  * {@link #setcustomtabview(int, int)}.  */ protected textview createdefaulttabview(context context) {     textview textview = new textview(context);     textview.setgravity(gravity.center);     textview.settextsize(typedvalue.complex_unit_sp, tab_view_text_size_sp);     textview.settypeface(typeface.default_bold);     textview.setlayoutparams(new linearlayout.layoutparams(             viewgroup.layoutparams.wrap_content, viewgroup.layoutparams.wrap_content));      typedvalue outvalue = new typedvalue();     getcontext().gettheme().resolveattribute(android.r.attr.selectableitembackground,             outvalue, true);     textview.setbackgroundresource(outvalue.resourceid);     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;         }          if (mdistributeevenly) {             linearlayout.layoutparams lp = (linearlayout.layoutparams) tabview.getlayoutparams();             lp.width = 0;             lp.weight = 1;         }          tabtitleview.settext(adapter.getpagetitle(i));         tabview.setonclicklistener(tabclicklistener);         string desc = mcontentdescriptions.get(i, null);         if (desc != null) {             tabview.setcontentdescription(desc);         }          mtabstrip.addview(tabview);         if (i == mviewpager.getcurrentitem()) {             tabview.setselected(true);         }     } }  public void setcontentdescription(int i, string desc) {     mcontentdescriptions.put(i, desc); }  @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);     } }  /**  * allows complete control on colors drawn in tab layout. set  * {@link #setcustomtabcolorizer(tabcolorizer)}.  */ public interface tabcolorizer {      /**      * @return return color of indicator used when {@code position} selected.      */     int getindicatorcolor(int position);  }  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);         }         (int = 0; < mtabstrip.getchildcount(); i++) {             mtabstrip.getchildat(i).setselected(position == i);         }         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;             }         }     } } 

}

on both classes google have no declared colorforeground assuming set android? appreciated on fixing issue colorforeground.

it because android not able find r.attr.colorforeground since (just did once) imported own r slidingtabstrip. better import import android.r; (android studio warns not to, tho) or use android.r.attr.colorforeground directly.


Comments

Popular posts from this blog

searchKeyword not working in AngularJS filter -

sequelize.js - Sequelize: sort by enum cases -

user interface - how to replace an ongoing process of image capture from another process call over the same ImageLabel in python's GUI TKinter -