android - Fragment 内的 onCreateOptionsMenu - 获取菜单项时出现 Nullpointerexception

标签 android xml android-fragments

我需要从 fragment 内部填充一个 Spinner 到 ActionbarSherlock .这是我所做的..

菜单 XML:main.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <com.actionbarsherlock.internal.widget.icsspinner
        android:id="@+id/menu_spinner"
        android:layout_width="wrap_content"
        android:layout_height="match_parent" >
    </com.actionbarsherlock.internal.widget.icsspinner>
</menu>

onCreateView 中的 fragment 内我用过setHasOptionsMenu(true);并且还覆盖了 onCreateOptionsMenu方法。

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.main, menu);

    SpinnerAdapter mSpinnerAdapter;

    if (Build.VERSION.SDK_INT <= 10) {
        mSpinnerAdapter = ArrayAdapter
                .createFromResource(activity, R.array.news_menu,
                        android.R.layout.simple_spinner_item);
    }else{
        mSpinnerAdapter = ArrayAdapter.createFromResource(activity,
                R.array.news_menu,
                android.R.layout.simple_spinner_dropdown_item);
    }

    Spinner spinner = (Spinner) menu.findItem(R.id.menu_spinner);

    if(spinner == null)
        Log.d(Const.DEBUG, "Spinner is Null");
    else
        Log.d(Const.DEBUG, "Spinner is Not Null");

    spinner.setAdapter(mSpinnerAdapter);
    spinner.setSelection(0);
}

但是 logcat显示“旋转器”是 null .关于如何让它工作的任何想法以及适配器是我填充 spinner 的地方的任何想法来自 string-array 的值在strings.xml

为了获取 fragment 中的上下文,我使用了 onAttach 方法,

@Override
public void onAttach(Activity activity) {
    this.activity = activity;
    super.onAttach(activity);
}

[编辑]

根据@blackbet 的建议,我修改了我的 xmlonCreateOptionsMenu .现在 NullPointerException不见了,但是spinnerempty ,最后还有一个溢出图标。

这里是代码更改:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.main, menu);

    SpinnerAdapter mSpinnerAdapter;

    if (Build.VERSION.SDK_INT <= 10) {
        mSpinnerAdapter = ArrayAdapter
                .createFromResource(activity, R.array.news_menu,
                        android.R.layout.simple_spinner_item);
    }else{
        mSpinnerAdapter = ArrayAdapter.createFromResource(activity,
                R.array.news_menu,
                android.R.layout.simple_spinner_dropdown_item);
    }

    MenuItem menuItem =   menu.findItem(R.id.menu_spinner);
    IcsSpinner spinner = (IcsSpinner) menuItem.getActionView();

    if(spinner == null)
        Log.d(Const.DEBUG, "Spinner is Null");
    else
        Log.d(Const.DEBUG, "Spinner is Not Null");

    spinner.setAdapter(mSpinnerAdapter);
    spinner.setSelection(0);
}

main.xml(菜单)

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item  
        android:id="@+id/menu_spinner"
        android:actionLayout="@layout/layout_config_menu"  
        android:layout_width="wrap_content"
        android:layout_height="match_parent" />
</menu>

layout_config_menu.xml(在布局文件夹中)

<?xml version="1.0" encoding="utf-8"?>
<com.actionbarsherlock.internal.widget.IcsSpinner 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/my_action_spinner"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

这是我的 news_menu 字符串数组

<string-array name="news_menu">
    <item>News</item>
    <item>Tour Dates</item>
    <item>Festival News And Rumors</item>
    <item>Late Night Performances</item>
</string-array>

最佳答案

您应该为您的布局文件创建一个条目并为其分配一个 actionLayout:

    <?xml version="1.0" encoding="utf-8"?>  
    <menu xmlns:android="http://schemas.android.com/apk/res/android" >  
     <item  
          android:id="@+id/menu_spinner"
          android:actionLayout="@layout/layout_config_menu"  
          android:layout_width="wrap_content"
          android:layout_height="match_parent" />

     </menu>

内部资源/布局

 <?xml version="1.0" encoding="utf-8"?>  
   <com.actionbarsherlock.internal.widget.IcsSpinner 
     xmlns:android="http://schemas.android.com/apk/res/android"  
     android:id="@+id/my_action_spinner"  
     android:layout_width="wrap_content"  
     android:layout_height="wrap_content" />  

在 onCreateOptionsMenu 中:

MenuItem menuItem =   menu.findItem(R.id.menu_spinner);
IcsSpinner spinner = menuItem.getActionView();

关于android - Fragment 内的 onCreateOptionsMenu - 获取菜单项时出现 Nullpointerexception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21748676/

相关文章:

android - 我如何获取存储在android的res/raw文件夹中的.mp3文件的URI

android - 未知错误(代码 14): Could not open database

fragment 中的android map

java - 当 AsyncTask 完成 Activity 时调用 fragment 方法

java - Ajax 响应中的 Set-Cookie header 不适用于 android webView

Android SQLite 数据库未填充

c# - XDocument.Load "Illegal characters in path."错误,但是当我测试函数时,有 XML

java - 在 JAXB 中解码时出错?

java - 如何配置 jaxb setter?

android-fragments - 片段中的映射片段 V2