kokoko
kokoko

Reputation: 3982

customizing android toolbar programmatically

I want to use android v7.toolbar in my project with fragments. So i did something like below in my main activity xml. Because i dont want to add all fragments xml to android.support.v7.widget.Toolbar

<?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.support.v7.widget.Toolbar
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:id="@+id/toolBar" />

  <FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/fragment_container">
  </FrameLayout>

</LinearLayout>

i am adding fragments with programmatically. And in some fragments i have to change right side of the toolbar. For example in some fragments i have to use just 1 right menu icon and another fragments 2. How can i achieve it?

Also is there a way to change icon resource which is in right side of the toolbar from fragments?

Thanks,

Upvotes: 0

Views: 2719

Answers (1)

ChoklatStu
ChoklatStu

Reputation: 228

You can create menu.xml and put all your menu items in it. Set all the items visibility to false. This hides everything.

Then in your fragment's onCreate set setHasOptionsMenu(true), this will allow you to override onCreateOptionsMenu(Menu m, MenuInflater inflater).

In this method you can do menu.findItem(id.of.item).setVisible(true/false).

Examples:

menu.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context="com.sample.app.MainActivity">    
    <item
        android:id="@+id/action_refresh"
        android:icon="@drawable/ic_action_refresh"
        android:orderInCategory="101"
        app:showAsAction="ifRoom"
        android:title="@string/action_refresh"
        android:visible="false"/>
    <item
        android:id="@+id/action_edit_account"
        android:icon="@drawable/ic_action_edit"
        android:orderInCategory="102"
        app:showAsAction="never"
        android:title="@string/action_edit_account"
        android:visible="false"/>
    <item
        android:id="@+id/action_enable_offline_token"
        android:orderInCategory="105"
        app:showAsAction="never"
        android:title="@string/action_enable_offline_token"
        android:visible="false"/>
    <item
        android:id="@+id/action_disable_offline_token"
        android:orderInCategory="105"
        app:showAsAction="never"
        android:title="@string/action_disable_offline_token"
        android:visible="false"/>
    <item
        android:id="@+id/action_save"
        android:icon="@drawable/ic_action_save"
        android:orderInCategory="106"
        app:showAsAction="ifRoom"
        android:title="@string/action_save"
        android:visible="false"/>
</menu>

Fragment:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);            
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
    {
        super.onCreateOptionsMenu(menu, inflater);        
        menu.findItem(R.id.action_refresh).setVisible(false);
        menu.findItem(R.id.action_save).setVisible(true);
    }

To change icons you can just get the menu and do a findItem and setIcon.

Upvotes: 3

Related Questions