2016-09-21 4 views
0

Ich versuche, ein Spinner und ein Listener in meinem Fragment hinzuzufügen. Android Studio nicht berichten mir einen Fehler, aber wenn ich es laufen, stürzt mit diesem FATAL AUSNAHME:SetOnItemSelectedListener() für Spinner in Fragment

14267-14267/? E/AndroidRuntime: FATAL EXCEPTION: main 
               Process: space.markwen.www.units, PID: 14267 
               java.lang.RuntimeException: Unable to start activity ComponentInfo{space.markwen.www.units/space.markwen.www.units.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference 
                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2456) 
                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2539) 
                at android.app.ActivityThread.access$900(ActivityThread.java:159) 
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1384) 
                at android.os.Handler.dispatchMessage(Handler.java:102) 
                at android.os.Looper.loop(Looper.java:152) 
                at android.app.ActivityThread.main(ActivityThread.java:5507) 
                at java.lang.reflect.Method.invoke(Native Method) 
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
               Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference 
                at space.markwen.www.units.LengthActivity.onCreate(LengthActivity.java:40) 
                at android.app.Fragment.performCreate(Fragment.java:2198) 
                at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:942) 
                at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148) 
                at android.app.BackStackRecord.run(BackStackRecord.java:793) 
                at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1535) 
                at android.app.FragmentController.execPendingActions(FragmentController.java:325) 
                at android.app.Activity.performStart(Activity.java:6320) 
                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2419) 
                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2539)  
                at android.app.ActivityThread.access$900(ActivityThread.java:159)  
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1384)  
                at android.os.Handler.dispatchMessage(Handler.java:102)  
                at android.os.Looper.loop(Looper.java:152)  
                at android.app.ActivityThread.main(ActivityThread.java:5507)  
                at java.lang.reflect.Method.invoke(Native Method)  

Fragment Klasse:

public class LengthActivity extends Fragment { 

    View lengthView; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     // Change FrameLayout to content_length 
     lengthView = inflater.inflate(R.layout.content_length, container, false); 
     // Change the title on titlebar to Length 
     ((AppCompatActivity)getActivity()).getSupportActionBar().setTitle("Length"); 
     return lengthView; 
    } 

    Spinner spinner; 
    String[] lengthUnits = { 
      "Kilometer", "Meter", "Centimeter", "Millimeter", "Micrometer", "Nanometer", "Mile", "Yard", "Foot", "Inch", "Nautical Mile"}; 

    @Override 
    public void onCreate (Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     spinner = (Spinner) getView().findViewById(R.id.lengthSpinner); 
     spinner.setOnItemSelectedListener(new OnItemSelectedListener() { 
      public void onItemSelected(AdapterView<?> parent, View view, 
             int position, long id) { 

      } 

      @Override 
      public void onNothingSelected(AdapterView<?> parent) { 

      } 
     }); 
     ArrayAdapter<String> adapter = new ArrayAdapter<String> (getActivity(), android.R.layout.simple_spinner_item, lengthUnits); 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     spinner.setAdapter(adapter); 
    } 

} 

Und meiner Meinung nach nur für den Fall können Sie etwas finden, aus ihm heraus:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" android:layout_height="match_parent" 
    android:weightSum="1"> 

    <EditText 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:inputType="numberDecimal" 
     android:ems="10" 
     android:id="@+id/editText" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:textSize="30dp" 
     android:layout_weight="1.01" /> 

    <Spinner 
     android:layout_width="112dp" 
     android:layout_height="57dp" 
     android:id="@+id/lengthSpinner" /> 
    <!--android:layout_below="@+id/editText"--> 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_marginTop="42dp" /> 
</LinearLayout> 

Dank

Antwort

1

Verschieben sie alle Ihre onCreate() co de — beginnend mit der Linie, die — in onViewCreated() abstürzt. Sie können nichts davon ausführen, bis onCreateView() aufgerufen wurde, und onCreate() wird vor onCreateView() aufgerufen. onViewCreated() heißt nachonCreateView().

+0

versuchte ich es, aber der gleiche Fehler noch existiert – thousight

+0

Oh später fand ich heraus, dass es war, weil Ansicht null wird in Fragment, also muss ich die lengthView verwenden, die ich vom Inflator bekommen habe, um den Spinner zu bekommen. Jetzt arbeiten die Dinge. Vielen Dank – thousight

0

Wie CommonsWare empfohlen, die Grundkomponenten eines Arbeits Beispiel würde wie folgt aussehen:

enter public class Booking extends Fragment { 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View rootView = inflater.inflate(R.layout.fragment_booking, container, false); 
return rootView; 
} 


public void onViewCreated(View rootView, Bundle savedInstanceState){ 
    super.onViewCreated(rootView, savedInstanceState); 
    final View v = rootView; 
// Spinner element 
Spinner spinner = (Spinner) rootView.findViewById(R.id.spinner); 

//spinner.setOnItemClickListener(this); 

// Spinner Drop down elements 
List<String> categories = new ArrayList<String>(); 
categories.add("4 Night/5 Days"); 
categories.add("5 Night/6 Days"); 
categories.add("6 Night/7 Days"); 
categories.add("7 Night/8 Days"); 

// Creating adapter for spinner 
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item, categories); 

// Drop down layout style - list view with radio button 
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

// attaching data adapter to spinner 
spinner.setAdapter(dataAdapter); 


// Spinner click listener 
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
    public void onItemSelected(AdapterView<?> parent, View view, 
           int position, long id) { 

     // On selecting a spinner item 
     String item = parent.getItemAtPosition(position).toString(); 


     // Showing selected spinner item 
     Toast.makeText(parent.getContext(), "Selected: " + item, Toast.LENGTH_LONG).show(); 

    } 

    @Override 
    public void onNothingSelected(AdapterView<?> parent) { 

    } 
}); 
} 
} 
Verwandte Themen