2017-08-27 56 views
1

如何從不同的類(活動或片段)訪問標籤條類?我想從其他地方改變它的背景顏色。如何從不同的類動態更改視圖背景顏色

當使用原標籤條類中的以下代碼它完美的作品:

mTabStrip.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.blue)); 

我相信,這樣的事情需要使用,但我不知道如何訪問它(TabStrip控件類)來自另一個類(即活動或片段)並更改背景顏色。

XML活動佈局

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/detail_container"> 

    <include layout="@layout/my_toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"/> 

    <com.companyname.appname.TabStrip 
     android:id="@+id/my_tabs" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"/> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/pager" 
     android:layout_height="0dp" 
     android:layout_width="match_parent" 
     android:layout_weight="1"/> 

</LinearLayout> 

Activity類

public class MyActivity extends AppCompatActivity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.my_activity); 

     final String toolbarColour = "#868F98"; 

     Toolbar customToolbar = findViewById(R.id.my_toolbar); 
     setActionBar(customToolbar); 
     customToolbar.setBackgroundColor(Color.parseColor(toolbarColour)); 

     TextView mTitle = this.findViewById(R.id.toolbar_title); 
     mTitle.setText(getString(R.string.toolbar)); 

     if (savedInstanceState == null) { 
      MyFragment newFragment = new MyFragment(); 
      FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
      transaction.replace(R.id.detail_container, newFragment); 
      transaction.commit(); 
     } 
    } 
} 

MyFragment.java

public class MyFragment extends android.support.v4.app.Fragment { 

    public MyFragment() {} 

    ViewPager pager; 
    MyFragmentViewPagerAdapter adapter; 
    MyTabStrip my_tabs; 
    int Numboftabs = 3; 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.my_fragment, container, false); 
     super.onCreate(savedInstanceState); 

     return v; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     View v = getView(); 

     adapter = new MyFragmentViewPagerAdapter(getChildFragmentManager(), Numboftabs, getActivity()); 

     assert v != null; 
     pager = v.findViewById(R.id.pager); 
     pager.setAdapter(adapter); 

     mytabs = v.findViewById(R.id.my_tabs); 
     mytabs.setDistributeEvenly(false); 

     my_tabs.setCustomTabColorizer(new TabStrip.TabColorizer() { 
      @Override 
      public int getIndicatorColor(int position) { 
       return Color.WHITE; 
      } 
     }); 

     mytabs.setViewPager(pager); 

     super.onActivityCreated(savedInstanceState); 
    } 

    private class MyFragmentViewPagerAdapter extends FragmentStatePagerAdapter { 

     private int NumbOfTabs; 
     private Context context; 

     MyFragmentViewPagerAdapter(FragmentManager fm, int mNumbOfTabsumb, Context context) { 
      super(fm); 

      this.context = context; 
      this.NumbOfTabs = mNumbOfTabsumb; 
     } 

     @Override 
     public Fragment getItem(int position) { 
      switch (position) { 
       case 0: 
        return new Tab1(); 
       case 1: 
        return new Tab2(); 
       case 2: 
        return new Tab3(); 
      } 
      return null; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      switch (position) { 
       case 0: 
        return context.getResources().getString(R.string.tab_1); 
       case 1: 
        return context.getResources().getString(R.string.tab_2); 
       case 2: 
        return context.getResources().getString(R.string.tab_3); 
      } 
      return super.getPageTitle(position); 
     } 

     @Override 
     public int getCount() { 
      return NumbOfTabs; 
     } 
    } 
} 

TabStrip.java

public class TabStrip extends HorizontalScrollView { 

    public interface TabColorizer { 
     int getIndicatorColor(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 boolean mDistributeEvenly; 

    private ViewPager mViewPager; 
    private SparseArray<String> mContentDescriptions = new SparseArray<>(); 
    private ViewPager.OnPageChangeListener mViewPagerPageChangeListener; 

    private final SlidingTabStrip mTabStrip; 

    public TabStrip(Context context) { 
     this(context, null); 
    } 

    public TabStrip(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public TabStrip(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 setCustomTabColorizer(TabStrip.TabColorizer tabColorizer) { 
     mTabStrip.setCustomTabColorizer(tabColorizer); 
    } 

    public void setDistributeEvenly(boolean distributeEvenly) { 
     mDistributeEvenly = distributeEvenly; 
    } 

    public void setSelectedIndicatorColors(int... colors) { 
     mTabStrip.setSelectedIndicatorColors(colors); 
    } 

    public void addOnPageChangeListener(ViewPager.OnPageChangeListener listener) { 
     mViewPagerPageChangeListener = listener; 
    } 

    public void setCustomTabView(int layoutResId, int textViewId) { 
     mTabViewLayoutId = layoutResId; 
     mTabViewTextViewId = textViewId; 
    } 

    public void setViewPager(ViewPager viewPager) { 
     mTabStrip.removeAllViews(); 

     mViewPager = viewPager; 
     if (viewPager != null) { 
      viewPager.addOnPageChangeListener(new TabStrip.InternalViewPagerListener()); 
      populateTabStrip(); 
     } 
    } 

    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 TabStrip.TabClickListener(); 

     for (int i = 0; i < adapter.getCount(); i++) { 
      View tabView = null; 
      TextView tabTitleView = null; 

      if (mTabViewLayoutId != 0) { 
       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; 
      } 

      assert tabTitleView != null; 
      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); 
      } 

      tabTitleView.setTextColor(Color.WHITE); 
      tabTitleView.setTextSize(14); 
     } 
    } 

    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) { 
       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); 
      } 
      for (int i = 0; i < 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) { 
      for (int i = 0; i < mTabStrip.getChildCount(); i++) { 
       if (v == mTabStrip.getChildAt(i)) { 
        mViewPager.setCurrentItem(i); 
        return; 
       } 
      } 
     } 
    } 
} 

回答

2

由於給出的XML佈局在活動中使用,則可以使用findViewById()訪問tabstrip的。此外,由於您需要在某些事件中更改其顏色,因此可以聲明全局變量以保存對TabStrip的引用。

的代碼會是這個樣子:

... 

public com.companyname.appname.TabStrip mTabStrip = null; /* global variable */ 

... 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.my_activity); 

     final String toolbarColour = "#868F98"; 

     mTabStrip = findViewById(R.id.my_tabs); 
     Toolbar customToolbar = findViewById(R.id.my_toolbar); 
     setActionBar(customToolbar); 
... 

然後,當然,你可以使用:

mTabStrip.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.blue)); 
0

創建您的主要活動是可變的公開二傳手。

這個setter可以是靜態的,也可以不是靜態的。相應地對待它。並應採用int顏色作爲參數。