Android 片段:尽管使用了onAttach(),但方向更改后,onTextChanged内的回调仍为null
我的碎片总是扔Android 片段:尽管使用了onAttach(),但方向更改后,onTextChanged内的回调仍为null,android,android-fragments,nullpointerexception,callback,orientation-changes,Android,Android Fragments,Nullpointerexception,Callback,Orientation Changes,我的碎片总是扔 java.lang.NullPointerException: Attempt to invoke interface method 'void FragmentClass$InputCallbacks.OnTextChanged(java.lang.CharSequence)' on a null object reference 因为这条线: UserInput.addTextChangedListener(new TextWatcher() { @
java.lang.NullPointerException: Attempt to invoke interface method 'void FragmentClass$InputCallbacks.OnTextChanged(java.lang.CharSequence)' on a null object reference
因为这条线:
UserInput.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
mListener.OnTextChanged(s);
}
});
我对mListener的其他用途不是扔东西。
我想这是因为使用了新的Textwatcher(){…},但我自己没有足够的经验来解决这个问题:-/
引发错误的整个类:
public class ToolbarInputOneAddress extends Fragment {
private InputCallbacks mListener;
public ToolbarInputOneAddress() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.toolbar_input_one_address, container, false);
Address address = mListener.getAddress();
EditText UserInput = (EditText) v.findViewById(R.id.InputField);
if (address != null) {
StringBuilder Sb = new StringBuilder();
UserInput.setText(SuggestAddresses.createFormattedAddressFromAddress(address, Sb));
}
UserInput.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
mListener.OnTextChanged(s);
}
});
ImageButton ReturnButton = (ImageButton) v.findViewById(R.id.btn_navigation_drawer_back);
ReturnButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mListener.onReturnButtonClicked();
}
});
return v;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (InputCallbacks) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement InputCallbacks");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
public interface InputCallbacks {
void OnTextChanged(CharSequence s);
void onReturnButtonClicked();
Address getAddress();
}
}
我想我解决了。
我在这样的组中以片段形式声明回调
public interface $Callbacks {
void $Callback1(String s);
void $Callback2();
Address $Callback2();
}
事实证明,我用相同的名称定义了多个回调组。我认为这没关系,因为我在活动中明确地用实现了
由于我将回调组的名称更改为不同的名称,因此不再获得NPE:
TL,DR:
我变了
实现$fragment1.callbacks$fragment2.callbacks$fragment3.callbacks
到
实现$fragment1.f1回调$fragment2.f2回调$fragment3.f3回调
在我实施上述片段回调的活动中您是否尝试在清单
上的活动
中设置android:configChanges=“orientation”
,因为我自己不处理。您的活动实施了InputCallbacks
?这只是我编的一个名称:-)将其重命名为回调
,同样的问题问题明确地说,在方向改变后,mListener
内部onTextChanged
是null
。奇怪的是,用于return按钮的OnClickListener
在方向更改后仍然具有有效的mListener
。。。。。TextWatcher有什么特别之处吗?