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
Post a Comment