Versuch zum aufrufen der virtuellen Methode auf einem null-Objekt Verweis
Dies ist die Fehlermeldung die ich bekomme:
03-11 08:27:48.513: E/AndroidRuntime(23647): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.plan.yeahimin/com.plan.yeahimin.PlanDetailsActivity}: java.lang.NullPointerException: Versuch zum aufrufen der virtuellen Methode java.io.Serializable android.os.Bundle.getSerializable(java.lang.String)' auf ein null-Objekt Verweis
Verstehe ich aufgrund einer variable mit einem null-Wert, aber ich kann nicht trainieren, warum. Es sieht aus wie es 's ' EXTRA_NEW_PLAN' in der getSerializable()
Methode in der DetailsFragment
aber andere als die, die ich nicht kenne. Ich bin neu bei Android, so verzeihen Sie mir, wenn es offensichtlich ist, aber jegliche Hilfe würde sehr geschätzt werden.
Hier ist mein code für die ListFragment
;
public class PlanListFragment extends ListFragment {
public final static String TAG = "com.plan.yeahimin.PlanListFragment";
public final static String EXTRA_NEW_PLAN = "com.plan.yeahimin.plan_id";
private Button mAddPlan;
private ArrayList<Plan> mPlansList;
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState){
View v = inflater.inflate(R.layout.empty_view_or_list_view, parent, false);
ListView view = (ListView) v.findViewById(android.R.id.list);
view.setEmptyView(v.findViewById(android.R.id.empty));
mAddPlan = (Button) v.findViewById(R.id.add_a_plan);
mAddPlan.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Log.d(TAG, "add plan clicked");
Plan plan = new Plan();
Log.d(TAG, "new plan created");
PlanArrayList.get(getActivity()).addPlans(plan);
Log.d(TAG, "plan added to mPlansList");
Intent i = new Intent(getActivity(), PlanDetailsActivity.class);
i.putExtra(PlanDetailsFragment.EXTRA_NEW_PLAN, plan.getId());
startActivity(i);
return;
}
});
return v;
}
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
mPlansList = PlanArrayList.get(getActivity()).getPlans();
//ArrayList<Plan> mPlansList = new ArrayList<Plan>();
PlanArrayAdapter paa = new PlanArrayAdapter(mPlansList);
setListAdapter(paa);
}
public class PlanArrayAdapter extends ArrayAdapter<Plan>{
public PlanArrayAdapter(ArrayList<Plan> planList){
super(getActivity(), 0, planList);
}
public View getView(int position, View convertView, ViewGroup parent){
//Get the plan item for this position
Plan plan = getItem(position);
//If layout doesnt exist, inflate one
if(convertView == null){
convertView = LayoutInflater.from(getContext()).inflate(R.layout.plan_list_fragment, parent, false);
}
TextView planTitle = (TextView) convertView.findViewById(R.id.plan_title);
planTitle.setText(plan.getTitle());
TextView planDate = (TextView) convertView.findViewById(R.id.plan_date);
planDate.setText(plan.getDate().toString());
return convertView;
}
}
}
und hier ist mein code für die DetailsFragment, die öffnet sich von der Schaltfläche hinzufügen;
public class PlanDetailsFragment extends Fragment {
private static final String TAG = "com.plan.yeahimin.PlanDetailsFragment";
public static final String EXTRA_NEW_PLAN = "com.plan.yeahimin.plan_id";
private EditText mTitleField;
private Button mDateButton;
private Button mTimeButton;
private EditText mLocationField;
private EditText mAttendeesField;
private EditText mDescriptionField;
private Plan mPlan;
private ArrayList<Plan> mPlansList;
public static PlanDetailsFragment newInstance(UUID planId){
Bundle args = new Bundle();
args.putSerializable(EXTRA_NEW_PLAN, planId);
PlanDetailsFragment f = new PlanDetailsFragment();
f.setArguments(args);
Log.d(TAG, "newInstance created");
return f;
}
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
UUID planId = (UUID)getArguments().getSerializable(EXTRA_NEW_PLAN);
mPlan = PlanArrayList.get(getActivity()).getPlan(planId);
}
@Override
public View onCreateView (LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState){
View v = inflater.inflate(R.layout.plan_details_fragment, parent, false);
mTitleField = (EditText)v.findViewById(R.id.plan_title);
mLocationField = (EditText)v.findViewById(R.id.plan_location);
mAttendeesField = (EditText)v.findViewById(R.id.plan_attendees);
mDescriptionField = (EditText)v.findViewById(R.id.plan_description);
mDateButton = (Button)v.findViewById(R.id.plan_date);
mTimeButton = (Button)v.findViewById(R.id.plan_time);
return v;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){
inflater.inflate(R.menu.main_to_do, menu);
}
public boolean onOptionsItemSelected(MenuItem item){
switch(item.getItemId()){
case R.id.save_button:
Log.d(TAG, "save button pressed");
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
- Problem mit args.putSerializable(EXTRA_NEW_PLAN, planId); Warum verwenden Sie die UUID , die auch zeigen, wo Sie den Aufruf newInstance(UUID)
- Ihr Problem ist in
PlanDetailsActivity
. Würden Sie bitte posten?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, Sie können nicht senden Sie alle Argumente auf Ihrer Fragment mit .newInstance(), da diese Methode übernimmt keine Parameter gemäß der Dokumentation. Also selbst wenn Sie überladen haben .newInstance(UUID), ruft das system .newInstance() (wenn Sie Anrufe an alle, ich habe einige Zweifel). Bitte beachten Sie, dass Sie setzen Sie den parameter auf Vorsatz mit .putExtra(), aber kann mich nicht erinnern, es aus der Absicht.
In der Tat der richtige Weg, um senden Sie Argumente, um ein Fragment ist wie folgt:
In der Anrufer (in der Regel ist es eine Aktivität, aber vielleicht mit einem anderen Fragment, wie in deinem Beispiel, würde es auch funktionieren, kann ich nicht sicher sagen):
Im fragment:
Es ist nicht eine ready-to-code verwenden, sollten Sie es anpassen, um Ihre Klassen-und Variablen-Namen, wo Sie Ihre tags sind Orte, etc. Die Anrufe von Aktivität Methoden erfordern auch eine Veränderung, wenn Sie die arbeiten lieber von einem anderen fragment. Es ist nur eine Allgemeine Beschreibung.
Meine Antwort gilt für die situation, wenn beide Fragmente sind innerhalb einer Aktivität. Ihre Verwendung von Intents, die machen mich Zweifel haben, in das, aber ich nicht ganz verstehen.
Geschickt Sie die Argumente, die zu einer Aktivität(PlanDetailsActivity).
Senden Sie die Argumente, um ein Fragment durch die newInstance () - Methode.
In Ihrem PlainDetailsActivity, sollten Sie die fragment-Instanz wie: