I've been trying to change the toolbar color when a selection of the menu is made. I'm working with Fragment, I've been reading a lot of the solution here on stack overflow but none of them seems to work. Any idea what I'm doing wrong?
I'm trying to change the color with a switch onNavigationItemSelected() of the MainActivity class.
So far I've only been able to change the color of the navigation bar and status bar but not toolbar or tabs bar.
If more info is need it just ask for it! thank you!
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;
}
}
Fragment
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);
}
}
Layout This is the layout for barTool with Tabs
<?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>
Update
I read the solution suggested by Nilesh Rathod on the comments but I don't understand how to implemented.
I just tried the solution suggested by Hardik Kanak on the comments and I'm getting this errors
--------- 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.
I also tried the solution of Mohamad Mahdi Farzaneh but I get this error:
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)
Beside the errors I'm also getting warnings about "uses or overrides a deprecated API". Any ideas what I'm doing wrong?