2014-03-24 34 views
0

我工作的一個片段類喜歡下:Spinners和上下文的問題?

public class DemandFragment extends Fragment implements LocationListener{... 

我已經聲明這一點:

Spinner spinner_loc; 
ArrayAdapter<String> spinner_loc_adapter = null; 

@Override 
    public void onActivityCreated(Bundle state){ 

     super.onActivityCreated(state); 
     Bundle bundle = this.getArguments(); 
     source_category = Integer.parseInt(bundle.getString("category")); 

     prepareSpinner(); 
... 

和我有未來,這是一個從onActivityCreated方法調用的函數(模塊化的代碼):

private void prepareSpinner(){ 

     spinner_loc = (Spinner) getView().findViewById(R.id.spinner_loc); 
... 

然後... prepareSpinner()方法的內部。

spinner_loc = null; 
spinner_loc_adapter = null; 
spinner_loc_adapter = new ArrayAdapter<String>(getActivity(), R.layout.spinner_content, values); 
spinner_loc.setAdapter(spinner_loc_adapter); 
spinner_loc_adapter.notifyDataSetChanged(); 

值是字符串數組。

問題:我在spinner_loc_adapter上收到空指針異常。我相信錯誤是上下文,但我不明白爲什麼。

什麼上下文必須在:Fragment_class - > oncreate() - > prepareSpinner()?

我已經嘗試在聲明中的上下文_c,並將它傳遞給getActivity()的適配器,但我得到相同的錯誤。

logcat的

03-24 12:51:46.605 12785-12785/com.test E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    java.lang.NullPointerException 
      at com.test.fragment.DemandFragment.prepareSpinner(DemandFragment.java:330) 
      at com.test.fragment.DemandFragment.onActivityCreated(DemandFragment.java:95) 
      at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1508) 
      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:947) 
      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104) 
      at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 
      at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467) 
      at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440) 
      at android.os.Handler.handleCallback(Handler.java) 
      at android.os.Handler.dispatchMessage(Handler.java) 
      at android.os.Looper.loop(Looper.java) 
      at android.app.ActivityThread.main(ActivityThread.java) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java) 
      at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132) 
      at dalvik.system.NativeStart.main(Native Method) 

XML:

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

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/fragment_content" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:background="@android:color/white"> 

    <ScrollView 
     android:layout_weight="0.9" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:overScrollMode="never" 
     android:scrollbars="none"> 

     <LinearLayout 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical"> 

      <LinearLayout 
       android:id="@+id/layout_select" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:orientation="vertical" 
       android:background="#1794d4" 
       android:alpha="0.9" 
       android:layout_marginLeft="30dp" 
       android:layout_marginRight="30dp"> 

       <TextView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:textColor="@android:color/white" 
        android:text="@string/offer_location" 
        android:textSize="18sp" 
        android:layout_marginTop="20dp" 
        android:layout_marginLeft="15dp" 
        android:id="@+id/offer_location" /> 

       <Spinner 
        android:id="@+id/spinner_location" 
        android:layout_width="fill_parent" 
        android:layout_height="30dp" 
        android:layout_marginLeft="15dp" 
        android:layout_marginRight="15dp" 
        android:layout_marginTop="15dp" 
        android:gravity="center_vertical" 
        android:background="@drawable/spinner_button" 
        android:headerDividersEnabled="false" 
        android:footerDividersEnabled="false" 
        android:divider="@drawable/spinner_button" 
        /> 

       <TextView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:textColor="@android:color/white" 
        android:text="@string/choose_brand_model" 
        android:textSize="18sp" 
        android:layout_marginTop="20dp" 
        android:layout_marginLeft="15dp" 
        android:textIsSelectable="false" /> 

       <Spinner 
        android:id="@+id/spiner_marca" 
        android:layout_width="fill_parent" 
        android:layout_height="30dp" 
        android:layout_marginLeft="15dp" 
        android:layout_marginRight="15dp" 
        android:layout_marginTop="15dp" 
        android:gravity="center_vertical" 
        android:background="@drawable/spinner_button" 
        android:headerDividersEnabled="false" 
        android:footerDividersEnabled="false" 
        android:divider="@drawable/spinner_button" 
        /> 

       <Spinner 
        android:id="@+id/spiner_modelo" 
        android:layout_width="fill_parent" 
        android:layout_height="30dp" 
        android:layout_marginLeft="15dp" 
        android:layout_marginRight="15dp" 
        android:layout_marginTop="10dp" 
        android:gravity="center_vertical" 
        android:background="@drawable/spinner_button" 
        android:headerDividersEnabled="false" 
        android:footerDividersEnabled="false" 
        android:divider="@drawable/spinner_button" 
        /> 

       <Button 
        android:id="@+id/bt_disable_spinner" 
        android:layout_width="fill_parent" 
        android:layout_height="20dp" 
        android:layout_marginLeft="15dp" 
        android:layout_marginRight="15dp" 
        android:layout_marginTop="15dp" 
        android:layout_marginBottom="15dp" 
        android:gravity="center" 
        android:textColor="@drawable/dark_blue_text_button" 
        android:text="@string/brand_not_sure" 
        android:textSize="10sp" 
        android:background="@drawable/dark_blue_border_button"/> 

      </LinearLayout> 

      <TextView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:textColor="#cccccc" 
       android:text="@string/wanted" 
       android:layout_below="@id/layout_select" 
       android:layout_marginLeft="30dp" 
       android:layout_marginTop="10dp"/> 

      <LinearLayout 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:orientation="horizontal" 
       android:gravity="center_horizontal" 
       android:id="@+id/layout_options"> 

       <ImageButton 
        android:id="@+id/bt_add_text" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_marginRight="50dp" 
        android:background="@android:color/transparent" 
        android:src="@drawable/ic_add_text"/> 

       <ImageButton 
        android:id="@+id/bt_add_photo" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_marginRight="40dp" 
        android:background="@android:color/transparent" 
        android:src="@drawable/ic_add_photo"/> 

       <ImageButton 
        android:id="@+id/bt_add_audio" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:background="@android:color/transparent" 
        android:src="@drawable/ic_add_audio"/> 
      </LinearLayout> 

      <LinearLayout 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:orientation="horizontal" 
       android:gravity="center_horizontal" 
       android:layout_marginTop="20dp" 
       android:layout_marginBottom="20dp" 
       android:id="@+id/layout_type"> 

       <Button 
        android:id="@+id/bt_nuevo" 
        android:layout_width="90dp" 
        android:layout_height="20dp" 
        android:textColor="@drawable/gray_text_button" 
        android:text="@string/demand_new" 
        android:textSize="10sp" 
        android:layout_marginRight="10dp" 
        android:background="@drawable/gray_border_button"/> 

       <Button 
        android:id="@+id/bt_km0" 
        android:layout_width="90dp" 
        android:layout_height="20dp" 
        android:textColor="@drawable/gray_text_button" 
        android:text="@string/demand_km0" 
        android:textSize="10sp" 
        android:layout_marginRight="10dp" 
        android:background="@drawable/gray_border_button"/> 

       <Button 
        android:id="@+id/bt_2mano" 
        android:layout_width="90dp" 
        android:layout_height="20dp" 
        android:textColor="@drawable/gray_text_button" 
        android:text="@string/demand_used" 
        android:textSize="10sp" 
        android:background="@drawable/gray_border_button"/> 
      </LinearLayout> 

     </LinearLayout> 
    </ScrollView> 

    <ImageView 
     android:layout_width="match_parent" 
     android:layout_height="40dp" 
     android:id="@+id/imageViewSend" 
     android:src="@drawable/bt_enviar_solicitud" 
     android:layout_gravity="center|bottom" 
     android:layout_marginTop="10dp" 
     android:background="#1794d4" 
     android:paddingLeft="80dp" 
     android:paddingRight="80dp" 
     android:layout_weight="0.1" 
     android:layout_alignParentBottom="true" 
     /> 

</LinearLayout> 
+0

是值有數據。 – MAOL

+0

如果在準備微調器時使用'getActivity()'而不是'getView()'會怎麼樣? –

回答

1

使用bewlow在片段onActivtiyCreatedspinner_loc可能爲null因爲getView()返回null。你需要等到創建活動和片段連接到活動

spinner_loc = (Spinner) getView().findViewById(R.id.spinner_loc); 
spinner_loc_adapter = new ArrayAdapter<String>(getActivity(), R.layout.spinner_content, values); 
spinner_loc.setAdapter(spinner_loc_adapter); 
spinner_loc_adapter.notifyDataSetChanged(); 

編輯:

<Spinner 
android:id="@+id/spinner_location" 

變化

spinner_loc = (Spinner) getView().findViewById(R.id.spinner_loc); 

spinner_loc = (Spinner) getView().findViewById(R.id.spinner_location); 
+0

@Victor_J_Martin然後是它沒有引用正確的id的情況。可以驗證,如果你可以發佈xml – Raghunandan

+0

它張貼。在prepareSpinner()方法之前,我已經改變了_c = getActivity()。getApplicationContext();我已經改性spinner_loc_adapter =新ArrayAdapter (getActivity(),R.layout.spinner_content,值); spinner_loc_adapter = new ArrayAdapter (_c,R.layout.spinner_content,values);但沒有任何變化。 :( – MAOL

+0

@Victor_J_Martin仍然得到NPE? – Raghunandan

0

嘗試使用波紋管代碼

View view =inflater.inflate(R.layout.fragment_view,null); 
spinner_loc = (Spinner) view.findViewById(R.id.spinner_loc); 
spinner_loc_adapter = new ArrayAdapter<String>(getActivity(), R.layout.spinner_content, values); 
spinner_loc.setAdapter(spinner_loc_adapter); 
spinner_loc_adapter.notifyDataSetChanged(); 
+0

謝謝。我對onCreateView方法充氣: @覆蓋 公共查看onCreateView(LayoutInflater吹氣,ViewGroup中容器,包savedInstanceState){ 回報inflater.inflate(R.layout.fragment_demand,容器,FALSE); } 我在課堂上使用getView以後。 – MAOL