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有什么特别之处吗?