2013-07-11 2 views
0

Я пытаюсь реализовать spinner в моей панели действий, чтобы переключаться между двумя различными фрагментами в активности. Чтобы реализовать его, я добавил spinner, используя XML в моем макете, а затем попытаюсь установить его адаптер в базовый класс активности. Вот мой класс активности,Spinner in Action Bar возвращает Null Pointer Exception

protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    Log.i(debug,"OnCreate"); 

setContentView(R.layout.add_new_course); 

Intent intent = getIntent(); 
semesterID = intent.getIntExtra("Semester ID", 0); 

    Log.i(TAG,"Add New Course created"); 

    spinner = (Spinner)findViewById(R.id.courseSpinner); 
    FragmentManager fragMan = getFragmentManager(); 


    if(savedInstanceState == null) 
    { 
     addDetailsFrag = new addCourseDetailsFragment(); 
     addWeightsFrag = new addCourseWeightsFragment(); 

     fragMan.beginTransaction().add(R.id.courseFragmentContainer, addDetailsFrag); 

    } 


} 

    @Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // TODO Auto-generated method stub 
    Log.i(debug,"onCreateOptionsMenu"); 

    getMenuInflater().inflate(R.menu.courses_menu, menu); 


    spinner = (Spinner)findViewById(R.id.courseSpinner); 


    if(spinner == null) 
     Log.i(debug,"spinner == null"); 
       //this always prints, which is causing a problem. 


    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,R.array.courseSpinner,android.R.layout.simple_spinner_item); 
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    spinner.setAdapter(adapter); 
    spinner.setOnItemSelectedListener(new OnItemSelectedListener() { 

     public void onItemSelected(AdapterView<?> adapter, View view, int position, long id) 
     { 

      //dostuff    

     } 

     public void onNothingSelected(AdapterView<?> adapter) 
     { 

          //domorestuff 
     } 


    }); 

    Log.i(TAG, "Menu Inflated"); 
    return true; 
} 

Вот мой LogCat, хотя это довольно прямо вперед, что его подразумевая нуль-указатель:

07-11 01:29:15.703: I/Debug Problem(6036): spinner == null 
07-11 01:29:15.723: D/AndroidRuntime(6036): Shutting down VM 
07-11 01:29:15.723: W/dalvikvm(6036): threadid=1: thread exiting with uncaught exception (group=0x40a71930) 
07-11 01:29:15.793: E/AndroidRuntime(6036): FATAL EXCEPTION: main 
07-11 01:29:15.793: E/AndroidRuntime(6036): java.lang.NullPointerException 
07-11 01:29:15.793: E/AndroidRuntime(6036):  at com.photoniccannon.passbook.AddNewCourse.onCreateOptionsMenu(AddNewCourse.java:77) 
07-11 01:29:15.793: E/AndroidRuntime(6036):  at android.app.Activity.onCreatePanelMenu(Activity.java:2490) 
07-11 01:29:15.793: E/AndroidRuntime(6036):  at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:407) 
07-11 01:29:15.793: E/AndroidRuntime(6036):  at com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:769) 
07-11 01:29:15.793: E/AndroidRuntime(6036):  at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:201) 
07-11 01:29:15.793: E/AndroidRuntime(6036):  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 
07-11 01:29:15.793: E/AndroidRuntime(6036):  at android.view.Choreographer.doCallbacks(Choreographer.java:562) 
07-11 01:29:15.793: E/AndroidRuntime(6036):  at android.view.Choreographer.doFrame(Choreographer.java:531) 
07-11 01:29:15.793: E/AndroidRuntime(6036):  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 
07-11 01:29:15.793: E/AndroidRuntime(6036):  at android.os.Handler.handleCallback(Handler.java:725) 
07-11 01:29:15.793: E/AndroidRuntime(6036):  at android.os.Handler.dispatchMessage(Handler.java:92) 
07-11 01:29:15.793: E/AndroidRuntime(6036):  at android.os.Looper.loop(Looper.java:137) 
07-11 01:29:15.793: E/AndroidRuntime(6036):  at android.app.ActivityThread.main(ActivityThread.java:5041) 
07-11 01:29:15.793: E/AndroidRuntime(6036):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-11 01:29:15.793: E/AndroidRuntime(6036):  at java.lang.reflect.Method.invoke(Method.java:511) 
07-11 01:29:15.793: E/AndroidRuntime(6036):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
07-11 01:29:15.793: E/AndroidRuntime(6036):  at com.android.internal.os.ZygoteInit.main  (ZygoteInit.java:560) 
07-11 01:29:15.793: E/AndroidRuntime(6036):  at dalvik.system.NativeStart.main(Native Method) 
07-11 01:34:15.983: I/Process(6036): Sending signal. PID: 6036 SIG: 9 
07-11 01:34:17.253: E/Trace(6137): error opening trace file: No such file or directory (2) 

редактировать: courses_menu.xml

<?xml version="1.0" encoding="utf-8"?> 

<Spinner 
    android:id="@+id/courseSpinner" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" /> 

Я не знаю, почему это пусто. Должен ли я создавать экземпляр счетчика в класс spinner?

Спасибо.

ответ

1

Если courseSpinner ресурс находится внутри courses_menu XML попробовать это:

MenuItem item = menu.findItem(R.id.courseSpinner); 
spinner = (Spinner)item.getActionView(); 

Это потому, что вы должны получить ресурс вращателя от меню ,

+0

Я также пробовал это, после этого, item возвращает null, поэтому его использование дает исключение. Я также обновляю свой вопрос с помощью classes_menu.xml. – iamseiko

+0

Вы используете ActionBar, не так ли? –

+0

Это меню опций, хотя, я думаю, его можно было бы назвать ActionBar. файл xml находится в /res/menu/courses_menu.xml – iamseiko

1

Почему у вас появился счетчик в методе onCreateOptionsMenu? Вы уже получаете spinner из xml в методе onCreate. Вы можете попробовать удалить эту строку в методе onCreateOptionsMenu:

spinner = (Spinner)findViewById(R.id.courseSpinner); 
+0

Первоначально у меня не было строки в методе onCreate(), я добавил это позже, потому что я думал, что, поскольку он был выполнен до onCreateOptionsMenu, он дал бы ненулевое значение. Удаление его также дает нулевое значение. – iamseiko

0

Я пробую это Spinner spinner = (Spinner) new Spinner (getActivity()); в ListFragment, который работает хорошо.

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 

ArrayAdapter<CharSequence> list = ArrayAdapter.createFromResource(getActivity(), R.array.showmessages,R.layout.spinner_item); 
     list.setDropDownViewResource(R.layout.spinner_dropdown_item); 
     inflater.inflate(R.menu.message, menu); 
     MenuItem item = (MenuItem) menu.findItem(R.id.menu_mode); 
     Spinner spinner = (Spinner) new Spinner(getActivity()); 
     spinner.setId(R.id.spinner1); 
     item.setActionView(spinner); 
     item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); 



message.xml 

<item android:id="@+id/menu_mode" 
    android:showAsAction="always" 
    android:title="@string/action_bar_spinner" 
    android:actionViewClass="android.widget.spinner" /> 

0

В случае, если кто работает в той же крошечной тупой ошибки, как я:

мне пришлось изменить

android:actionViewClass="android.widget.spinner" 

в

app:actionViewClass="android.widget.spinner" 

Не знаю, почему хотя, если кто-то k nows, просвещать меня;)