android - 更改片段上的工具栏颜色
问题描述
选择菜单时,我一直在尝试更改工具栏颜色。我正在使用 Fragment,我在这里阅读了很多关于堆栈溢出的解决方案,但它们似乎都不起作用。知道我做错了什么吗?
我正在尝试使用 MainActivity 类的 onNavigationItemSelected() 开关更改颜色。
到目前为止,我只能更改导航栏和状态栏的颜色,但不能更改工具栏或选项卡栏。
如果需要更多信息,请索取!谢谢你!
MainActivity.class
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
DrawerLayout drawerLayout;
NavigationView navigationView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
drawerLayout = findViewById(R.id.drawer_layout);
navigationView = findViewById(R.id.navigation_view);
if (navigationView != null)
navigationView.setNavigationItemSelectedListener(this);
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new AppBarMainFragment())
.commit();
updateToolbar(getString(R.string.perfil));
}
public void updateToolbar(String title) {
Toolbar toolbar = findViewById(R.id.toolbar);
if (toolbar != null)
toolbar.setTitle(title);
setSupportActionBar(toolbar);
ActionBarDrawerToggle toogle = new ActionBarDrawerToggle(this, drawerLayout, toolbar,
R.string.open_drawer, R.string.close_drawer);
drawerLayout.addDrawerListener(toogle);
toogle.syncState();
}
@Override
public boolean onNavigationItemSelected(MenuItem item) {
int itemId = item.getItemId();
LinearLayout rl = findViewById(R.id.header_wrapper);
// AppBarLayout abl = findViewById(R.id.fragTabs_Background); Do not work
// Integer colorTo = getResources().getColor(R.color.colorFacebook); Do not work
Fragment fragment = null;
switch (itemId) {
case R.id.nav_home:
fragment = new AppBarMainFragment();
break;
case R.id.nav_facebook:
BaseViewPagerAdapter adapter = new BaseViewPagerAdapter(
getSupportFragmentManager(), new String[] {"Siguiendo", "Seguidores"});
fragment = AppBarMainWithTabsFragment.getInstance(adapter, getString(R.string.facebook));
// setActionBar(getSupportActionBar().setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.colorFacebook))));
// abl.setBackground(new ColorDrawable(getResources().getColor(R.color.colorFacebook)));
rl.setBackgroundColor(getResources().getColor(R.color.colorFacebook));
if (Build.VERSION.SDK_INT >= 21){
getWindow().setNavigationBarColor(getResources().getColor(R.color.colorFacebook));
getWindow().setStatusBarColor(getResources().getColor(R.color.colorDarkFacebook));
}
break;
case R.id.nav_twitter:
BaseViewPagerAdapter adapter1 = new BaseViewPagerAdapter(
getSupportFragmentManager(), new String[] {"Recomendadas", "Miembro", "Tuyas"});
fragment = AppBarMainWithTabsFragment.getInstance(adapter1, getString(R.string.twitter));
break;
case R.id.nav_instagram:
View view = findViewById(android.R.id.content);
Snackbar.make(view, "Se ha pulsado para abrir las configuraciones.", Snackbar.LENGTH_LONG).show();
break;
}
if (fragment != null) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, fragment)
.commit();
}
drawerLayout.closeDrawer(GravityCompat.START);
return true;
}
}
分段
public class AppBarMainWithTabsFragment extends Fragment {
private BaseViewPagerAdapter adapter;
private String title;
public static AppBarMainWithTabsFragment getInstance(BaseViewPagerAdapter adapter, String title) {
AppBarMainWithTabsFragment fragment = new AppBarMainWithTabsFragment();
fragment.adapter = adapter;
fragment.title = title;
return fragment;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.app_bar_main_with_tabs, container, false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
ViewPager viewPager = view.findViewById(R.id.view_pager);
viewPager.setAdapter(adapter);
TabLayout tabLayout = view.findViewById(R.id.tab_layout);
tabLayout.setupWithViewPager(viewPager);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
MainActivity mainActivity = (MainActivity) getActivity();
mainActivity.updateToolbar(title);
}
}
布局这是带有选项卡的 barTool 的布局
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<android.support.design.widget.AppBarLayout
android:id="@+id/fragTabs_Background"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />
<android.support.design.widget.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="?attr/actionBarSize"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</android.support.design.widget.CoordinatorLayout>
更新
我阅读了Nilesh Rathod在评论中建议的解决方案,但我不明白如何实施。
我刚刚尝试了Hardik Kanak在评论中建议的解决方案,但我收到了这个错误
--------- beginning of crash
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.socialhub, PID: 9027
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.ActionBar.setBackgroundDrawable(android.graphics.drawable.Drawable)' on a null object reference
at com.example.socialhub.MainActivity.onNavigationItemSelected(MainActivity.java:80)
at android.support.design.widget.NavigationView$1.onMenuItemSelected(NavigationView.java:170)
at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:840)
at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:158)
at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:991)
at android.support.design.internal.NavigationMenuPresenter$1.onClick(NavigationMenuPresenter.java:352)
at android.view.View.performClick(View.java:5280)
at android.view.View$PerformClick.run(View.java:21239)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:234)
at android.app.ActivityThread.main(ActivityThread.java:5526)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Application terminated.
我也尝试了Mohamad Mahdi Farzaneh的解决方案,但我得到了这个错误:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.socialhub, PID: 14964
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.ActionBar.setBackgroundDrawable(android.graphics.drawable.Drawable)' on a null object reference
at com.example.socialhub.MainActivity.onNavigationItemSelected(MainActivity.java:80)
at android.support.design.widget.NavigationView$1.onMenuItemSelected(NavigationView.java:170)
at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:840)
at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:158)
at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:991)
at android.support.design.internal.NavigationMenuPresenter$1.onClick(NavigationMenuPresenter.java:352)
at android.view.View.performClick(View.java:5280)
at android.view.View$PerformClick.run(View.java:21239)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:234)
at android.app.ActivityThread.main(ActivityThread.java:5526)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
除了错误之外,我还收到有关“使用或覆盖已弃用的 API”的警告。任何想法我做错了什么?
解决方案
您可以将此行添加到您的活动中
toolbar.setBackgroundColor(getResources().getColor(R.color.green));
推荐阅读
- c# - 如何在 CefSharp 中以树结构显示 XML
- jupyter-notebook - 在 Jupyter Notebook 运行时切换 Anaconda 环境
- java - 如何在没有弹簧启动的情况下模拟 J2EE 中的 junit 数据库
- sql - PostgreSQL ANY IN 子选择结果
- sql - 在 SQL 'case when' 中满足任何条件时返回值
- flutter - 有没有办法在颤振中验证国际电话号码
- ios - 修改日期和时间生成代码签名错误
- angular - 为每个请求添加静态值的授权标头
- paypal - 将 wix + paypal 集成到结帐时的 paypal 注册/登录页面
- reactjs - 对最终用户隐藏 api_call