2015-05-26 3 views
4

При компиляции моего кода я получаю эту ошибку («java.lang.NullPointerException: попытка вызвать метод интерфейса»), и я все еще не могу понять, почему.Android + java.lang.NullPointerException: попытка вызвать метод интерфейса

Вот мой код:

public class FragmentDetails extends Fragment { 

     private TextView text1, text2, text3, text4, text5 = null; 
     private Button button1 = null; 


     OnDetailsDefinedListener mCallback; 

     public interface OnDetailsDefinedListener { 
      void executeOrder(String a, String b, String c, String d, String e); 
     } 


     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

      rootView = inflater.inflate(R.layout.fragment_details, container, false); 

      button1 = (Button) rootView.findViewById(...); 

      button1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       text1 = getActivity().findViewById(...); 
       text2 = getActivity().findViewById(...); 
       text3 = getActivity().findViewById(...); 
       text4 = getActivity().findViewById(...); 
       text5 = getActivity().findViewById(...); 

       String a = text1.getText().toString(); 
       String b = text2.getText().toString(); 
       String c= text3.getText().toString(); 
       String d= text4.getText().toString(); 
       String e= text5.getText().toString(); 

       //this is where my error appears 
       mCallback.executeOrder(a, b, c, d, e); 
      } 
      return rootView; 
     } 
    } 

(вот мое сообщение об ошибке)

05-26 09:39:20.868 2916-2916/? E/AndroidRuntime﹕ FATAL EXCEPTION: main 
     Process: com.example.blueHatCoder.myapplication, PID: 2916 
     java.lang.NullPointerException: Attempt to invoke interface method 'void com.example.blueHatCoder.myapplication.FragmentDetails$OnDetailsDefinedListener.executeOrder(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)' on a null object reference 
     at com.example.blueHatCoder.myapplication.FragmentDetails$6.onClick(FragmentDetails.java:131) 
     at android.view.View.performClick(View.java:4756) 
     at android.view.View$PerformClick.run(View.java:19749) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5221) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 

Спасибо заранее.

+1

mCallback никогда не инициированная ... –

ответ

1

Ваша переменная mCallback определена, но не инициализирована. Вы должны инициализировать его, прежде чем сможете его использовать.

5

mCallback не инициируется. вы должны сделать что-то вроде этого:

mCallback = new OnDetailsDefinedListenerImpl(); 
mCallback.executeOrder(a, b, c, d, e); 

или

mCallback = new OnDetailsDefinedListener(){ 
    @Override 
    void executeOrder(String a, String b, String c, String d, String e){ 
    //doSomething 
    }; 
} 
+0

вещи ..., так как я использую интерфейс, цель для деятельности, которая реализует его, чтобы иметь код, который «что-то делает». Другое дело, что я сделал точно то же самое на другом фрагменте (не инициализировал mCallback), и он работал ... – BlueHatCoder

+1

no. если что-то никогда не инициируется, вы получите NPE. Всегда! –

+0

вы правы ... моя ошибка, и я только что нашел то, чего не хватало. Спасибо за помощь :) – BlueHatCoder

1

Вы должны добавить публичный метод класса FragmentDetails.

public setOnDetailsDefinedListener(OnDetailsDefinedListener listener) { 
    mCallback = listener; 
} 

И просто реализуйте его в классе вызывающего абонента. точно так же, как вы делаете, когда добавляете кнопку прослушивателя.

mFragmentDetails.setOnDetailsDefinedListener(new OnDetailsDefinedListener() { 
// You code 
}) 
0

Может быть, вам нужно использовать onAttach (активность активность) фрагменты методы

public void onAttach(Activity activity){ 
    super.onAttach(activity); 
    if(activity instanceof onSomeListener){ 
     mListener=(onSomeListener) activity; 
    } 
} 
Смежные вопросы