Android:自定义选项菜单

时间:2016-12-08 06:51:23

标签: android android-actionbar android-custom-view android-optionsmenu

我正在开发一个应用程序,其中我想显示一个自定义菜单项,显示计数和休息菜单项是默认类型的项目,如下图所示。

enter image description here

我的menu.xml代码如下:

<?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>

我的actionbar_badge_layout.xml代码是:

<?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>

在我的片段中,我所做的是:

@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);
}

但是当我导航到相应的片段时,我得到空指针异常。 我按照this link.

的最高投票回答

我错过了什么或做错了什么?请指导我。

1 个答案:

答案 0 :(得分:1)

在你的onCreateOptionsMenu中,你正在尝试这个:

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

此处的项目“id”错误。您已将ID设置为“menu_5”并尝试使用“option_5”进行抓取。我看到的只是菜单项的“title”。