2016-11-24 14 views
0

возникли проблемы с получением фрагмента Общительность работает нормально ..Проблемы с Fragment TextWatcher к деятельности связи

У меня есть поле редактирования в фрагменте и мне нужно, чтобы отправить его значение обратно в основной деятельности после каждого редактирования.

Фрагмент Класс:

public class FragA extends Fragment { 

    FragAInt mCallback; 

    public interface FragAInt{ 
     public void onEditBoxEdited(String boxContent); 
    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View view = inflater.inflate(R.layout.fragment_a, container, false); 
     final View et = view.findViewById(R.id.eboxa) ; 

     ((EditText) et).addTextChangedListener(new TextWatcher() { 
      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 

       // TODO Auto-generated method stub 

      } 
      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

       // TODO Auto-generated method stub 
      } 

      @Override 
      public void afterTextChanged(Editable s) { 
       mCallback.onEditBoxEdited(((EditText) et).getText().toString()); 
      } 
     }); 
     return view; 
    } 
} 

MainActivity

public class MainActivity extends FragmentActivity implements FragA.FragAInt{ 

    private String editBoxVal; 

    public void onEditBoxEdited(String editBoxContent){ 
     this.editBoxVal= editBoxContent; 
    } 
} 

приложение будет работать, но это приведет к краху, как только вы наберете в поле выхода с нулевым указателем исключения.

Где я пошла не так?

Полная ошибка:

java.lang.NullPointerException: 
Attempt to invoke interface method 'void nemo.myapplication.FragA$FragAInt.onEditBoxEdited(java.lang.String)' on a null object reference 
at nemo.myapplication.FragA$1.afterTextChanged(FragA.java:49) 
at android.widget.TextView.sendAfterTextChanged(TextView.java:8017) 
at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:10182) 
at android.text.SpannableStringBuilder.sendAfterTextChanged(SpannableStringBuilder.java:1043) 
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:560) 
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:492) 
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:34) 
at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:685) 
at android.view.inputmethod.BaseInputConnection.setComposingText(BaseInputConnection.java:445) 
at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:340) 
at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:78) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:234) 
at android.app.ActivityThread.main(ActivityThread.java:5526) 
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) 
+0

Добавить ошибку, которая у вас есть. Я предполагаю, что получение ссылки на представление EditText равно null. и вы пытаетесь вызвать методы на нем. mCallback не инициализирован, проверьте это. – Rafal

+0

Это все ваш код? где вы назначаете переменную mCallback? Как вы добавляете фрагмент к активности? – diedu

+0

Это все мой код. Im, идущий от этого примера: https://developer.android.com/training/basics/fragments/communicating.html У меня была функция onAttach, но она жаловалась, что функция устарела. –

ответ

1

Вам нужно назначить переменную mCallback. Я думаю, вы пропустили эту часть, вы можете использовать событие onAttach.

public class FragA extends Fragment { 

    FragAInt mCallback; 

    public interface FragAInt{ 
     public void onEditBoxEdited(String boxContent); 
    } 

    public FragA(FragAInt mCallback) { 
     this.mCallback = mCallback; 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 

     // This makes sure that the container activity has implemented 
     // the callback interface. If not, it throws an exception 
     try { 
      mCallback = (FragAInt) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() 
        + " must implement OnHeadlineSelectedListener"); 
     } 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View view = inflater.inflate(R.layout.fragment_a, container, false); 
     final View et = view.findViewById(R.id.eboxa) ; 

     ((EditText) et).addTextChangedListener(new TextWatcher() { 
      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 

       // TODO Auto-generated method stub 

      } 
      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

       // TODO Auto-generated method stub 
      } 

      @Override 
      public void afterTextChanged(Editable s) { 
       mCallback.onEditBoxEdited(((EditText) et).getText().toString()); 
      } 
     }); 
     return view; 
    } 
} 
+0

Ах. Android Studio жалуется, что функция onAttach устарела, поэтому я предположил, что это означает, что я не должен ее использовать, или, по крайней мере, она больше не нужна. Спасибо –

+0

, что интересно. Я нашел это http://stackoverflow.com/questions/32083053/android-fragment-onattach-deprecated. Было бы хорошо реализовать любой ответ, чтобы убедиться, что ваше приложение работает во всех версиях sdk, на которые вы нацеливаете – diedu