片段内的onCreateOptionsMenu - 获取菜单项时的Nullpointerexception

时间:2014-02-13 08:22:59

标签: android xml android-fragments

我需要将片段内的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中的片段中,我使用了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。关于如何使这个工作的任何想法以及适配器是我填充spinnerstring-array的{​​{1}}值的方式

要获取Fragment中的上下文,我使用的是onAttach方法,

strings.xml

[编辑]

根据@blackbet建议,我修改了我的@Override public void onAttach(Activity activity) { this.activity = activity; super.onAttach(activity); } xml。现在onCreateOptionsMenu已消失,但NullPointerExceptionspinner,最后我也会收到溢出图标。

以下是代码更改:

empty

main.xml(菜单)

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

layout_config_menu.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>

这是我的news_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" />

1 个答案:

答案 0 :(得分:1)

您应该为布局文件创建一个条目,并为其分配一个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>

内部res / layout

 <?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();
相关问题