Manoj Fegde
Manoj Fegde

Reputation: 4761

Android: Custom option menu

I am developing an application in which i want to show a one custom menu item which shows count and rest menu items are default type of item as shown in image below.

enter image description here

My code of menu.xml is as below:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:myapp="http://schemas.android.com/apk/res-auto" >

    <item
        android:id="@+id/menu_1"
        android:icon="@drawable/icon_1"
        android:orderInCategory="101"
        android:title="@string/option_1"
        myapp:showAsAction="always"/>
    <item
        android:id="@+id/menu_2"
        android:icon="@drawable/icon_2"
        android:orderInCategory="102"
        android:title="@string/option_2"
        myapp:showAsAction="always"/>
    <item
        android:id="@+id/menu_3"
        android:icon="@drawable/icon_3"
        android:orderInCategory="103"
        android:title="@string/option_3"
        myapp:showAsAction="always"/>
    <item
        android:id="@+id/menu_4"
        android:icon="@drawable/icon_4"
        android:orderInCategory="104"
        android:title="@string/option_4"
        myapp:showAsAction="always"/>
    <item
        android:id="@+id/menu_5"
        android:orderInCategory="105"
        android:title="@string/option_5"
        myapp:showAsAction="never"
        android:actionLayout="@layout/actionbar_badge_layout" />
</menu>

My code of actionbar_badge_layout.xml is :

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_gravity="right"
    android:id="@+id/actionbar_badge_layout" >

    <TextView
        android:id="@+id/actionbar_notifcation_textview"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:clickable="true"
        android:padding="10dp"
        android:text="@string/option_1"
        android:textColor="@android:color/black"
        android:layout_toLeftOf="@+id/actionbar_notifcation_count_textview"/>

    <TextView
        android:id="@+id/actionbar_notifcation_count_textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:padding="10dp"
        android:text="99"
        android:textColor="@android:color/white"
        android:background="@drawable/badge_circle" />
</RelativeLayout>

In my fragment what i done is :

@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,  Bundle savedInstanceState) {
    View view=inflater.inflate(R.layout.fragment_myfragment, container,false);
    setHasOptionsMenu(true);
    ((SlidingBaseActivity) getActivity()).setActionBarTitle("My Fragment");
    ((SlidingBaseActivity) getActivity()).keepMenuClosed(false);
    ((SlidingBaseActivity) getActivity()).makeActionOverflowMenuShown();
    initView(view);
    dialog = Helper.showPleaseWaitDialog(getActivity());
    getdata();

    return view;
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    menu.findItem(R.id.option_1).setVisible(true);
    menu.findItem(R.id.option_1).setOnMenuItemClickListener(this);
    menu.findItem(R.id.option_2).setVisible(true);
    menu.findItem(R.id.option_2).setOnMenuItemClickListener(this);
    menu.findItem(R.id.option_3).setVisible(true);
    menu.findItem(R.id.option_3).setOnMenuItemClickListener(this);
    menu.findItem(R.id.option_4).setVisible(true);
    menu.findItem(R.id.option_4).setOnMenuItemClickListener(this);
    menu.findItem(R.id.option_5).setVisible(true);
    menu.findItem(R.id.option_5).setOnMenuItemClickListener(this);

    RelativeLayout badgeLayout = (RelativeLayout) menu.findItem(R.id.option_5).getActionView();
    TextView textViewMenuText = (TextView) badgeLayout.findViewById(R.id.actionbar_notifcation_textview);
    textViewMenuText.setText("Notification ");
    TextView textViewCount = (TextView) badgeLayout.findViewById(R.id.actionbar_notifcation_count_textview);
    textViewCount.setText("99");

    super.onCreateOptionsMenu(menu, inflater);
}

But i am getting null pointer exception when i navigate to the respective fragment. I follow the max voted answer from the this link.

What i am missing or doing wrong? Please guide me.

Upvotes: 4

Views: 4795

Answers (1)

NKoyee
NKoyee

Reputation: 561

In your onCreateOptionsMenu you are trying this:

RelativeLayout badgeLayout = (RelativeLayout) menu.findItem(R.id.option_5).getActionView();

The 'id' to the item is wrong here. You have set the id as 'menu_5' and trying to fetch with 'option_5'. Which I see is exactly your 'title' to the menu item.

Upvotes: 1

Related Questions