2015-03-11 4 views
-1

Это ошибка, я получаю:Попытка вызвать виртуальный метод на нулевой ссылки на объект

03-11 08: 27: 48,513: E/AndroidRuntime (23647): java.lang.RuntimeException: Невозможно start activity ComponentInfo {com.plan.yeahimin/com.plan.yeahimin.PlanDetailsActivity}: java.lang.NullPointerException: попытка вызвать виртуальный метод 'java.io.Serializable android.os.Bundle.getSerializable (java.lang.String) 'по ссылке нулевого объекта

Я понимаю его из-за переменной, имеющей нулевое значение, но я не могу тренироваться, почему. Похоже, что это «EXTRA_NEW_PLAN» в методе getSerializable() в DetailsFragment, но кроме этого я не знаю. Я новичок в Android, поэтому простите меня, если это будет очевидно, но любая помощь будет очень признательна.

Вот мой код для 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; 
    } 

} 

} 

и вот мой код для DetailsFragment, который открывается из кнопки добавления;

+0

Проблема с args.putSerializable (EXTRA_NEW_PLAN, planId); Почему вы используете UUID, также показываете, где вы вызываете newInstance (UUID) – IshRoid

+0

, ваша проблема находится в 'PlanDetailsActivity'. Не могли бы вы разместить его? – Blackbelt

ответ

0

Вы отправили аргументы в Activity (PlanDetailsActivity).

Вы должны отправить аргументы в фрагмент с помощью метода newInstance().

В вашем PlainDetailsActivity, вы должны создать экземпляр фрагмента, как:

UUID uuid = getIntent().getSerializableExtra(PlanDetailsFragment.EXTRA_NEW_PLAN); 
PlanDetailsFragment f = PlanDetailsFragment.newInstance(uuid); 
2

Я думаю, что вы не можете послать какие-либо аргументы в свой фрагмент с .newInstance(), так как этот метод не принимает никаких параметров в соответствии с документация. Так что даже если вы перегрузили .newInstance (UUID), система вызывает .newInstance() (если вообще звонит, у меня есть некоторые сомнения). Также имейте в виду, что вы задали параметр Intent с .putExtra(), но не помните его из Intent.

На самом деле правильный способ передачи аргументов в фрагмент выглядит следующим образом:

В вызывающему (обычно это активность, но, возможно, с другим фрагментом, как в вашем примере, он также будет работать, я не могу сказать точно):

PlanDetailsFragment fragment = new PlanDetailsFragment(); 
Bundle args = new Bundle(); 
args.putSerializable(PlanDetailsFragment.TAG_NEW_PLAN, plan.getID()); 
fragment.setArguments(args); 
getFragmentManager().beginTransaction().add(fragment, TAG_DETAILS_FRAGMENT).commit(); 

в фрагменте:

Bundle args = getArguments(); 
UUID planID = (UUID) args.getSerializable(TAG_NEW_PLAN); 

Это не готовый к использованию код, вы должны адаптировать его к классам и имен переменных, к Whe re ваши теги являются местами и т. д. При вызове методов Activity также может потребоваться некоторое изменение, если вы предпочитаете работать с другим фрагментом. Это просто общее описание.

Мой ответ относится к ситуации, когда оба фрагмента находятся внутри одного действия. Твое использование намерений заставляет меня сомневаться в этом, но я не совсем понимаю это.

Смежные вопросы

 Смежные вопросы