gpt4 book ai didi

java - 如何动态更改来自不同类的 View 背景颜色

转载 作者:行者123 更新时间:2023-11-29 19:09:23 28 4
gpt4 key购买 nike

如何从不同的类( Activity 或 fragment )访问标签条类?我想从其他地方更改它的背景颜色。

在原始标签条类中使用以下代码时,它可以完美运行:

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

我相信需要使用这样的东西,但我不知道如何从另一个类(即 Activity 或 fragment )访问它(TabStrip 类)并更改背景颜色。

XML Activity 布局

<?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;
}
}
}
}
}

最佳答案

由于给定的 xml 布局正在 Activity 中使用,您可以使用 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));

关于java - 如何动态更改来自不同类的 View 背景颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45905299/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com