1

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.

enter image description here

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?

PhönixGeist
  • 309
  • 3
  • 16

3 Answers3

0

you can add this line to your activity

toolbar.setBackgroundColor(getResources().getColor(R.color.green));

mmfarzaneh
  • 381
  • 1
  • 11
0

there is a problem in your code. give your toolbar class scope not method. declare your toolbar as you declared NavigationView and drawyer layout outside updateToolbar() method.

Toolbar toolbar;

then initialise it like this:

toolbar = findViewById(R.id.toolbar);

and then you'll be able to change colour:

toolbar.setBackgroundColor(getResources().getColor(R.color.green));
Faisal
  • 705
  • 3
  • 16
  • Ok, I'll have to modify all my fragments because it is giving me error, because now they can't find the updateToolbar(). But I'll do the changes... – PhönixGeist Mar 06 '19 at 02:31
0

If you have space on the fragment, add toolbar inside the fragment and use the activity theme as Appcompat.noactionbar. Don't use the toolbar of activity. It is a much longer task. Besides if you want to add somefunctionality inside of toolbar it will be a little bit difficult from fragment to adding functionality to activity toolbar.

Short cut:- use 1 toolbar for 1 fragment and remember which kind of toolbar you are using. Android support version toolbar or regular toolbar

raj kavadia
  • 926
  • 1
  • 10
  • 30