addTextChangedListener и onTextChanged всегда вызываются при загрузке фрагмента Android

у меня есть EditText в Android Fragment. Я придаю addTextChangedListener ему в onCreateView метод. В addTextChangedListener у меня есть onTextChanged метод. Войдя, я вижу, что каждый раз Fragment загружается, onTextChanged называется. С чего бы это? Я хочу, чтобы он вызывался только тогда, когда пользователь фактически изменяет текст в EditText. Вот мой код:

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

    View view = inflater.inflate(R.layout.detailfragment, container, false);
    final EditText notes = (EditText)view.findViewById(R.id.stitchnotes);
notes.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) {
            Edited = true;
        }
    });

    return view;
}

нашел этот пост и этот пост и мне интересно, должен ли я переместить свой код в onResume. Однако, как вы можете видеть из приведенного выше кода, мне нужен доступ к LayoutInflater и ViewGroup перешло к onCreateView для доступа к EditText, однако, onResume обычно не имеет доступа к этим элементам. Должен ли я использовать onResume? Как я могу справиться с проблемой с LayoutInflater и ViewGroup?

-----------------Дополнительная Информация----------------------

я использовал ответ Тайлера, чтобы решить проблему использования onResume, но onTextChanged все еще вызывается, когда я впервые открываю Fragment. Может кто-нибудь объяснить, почему? Вот мой измененный код:

private EditText notes;
@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.detailfragment, container, false);
    notes = (EditText)view.findViewById(R.id.stitchnotes);
    return view;
}

@Override
public void onResume() {
    super.onResume();
    notes.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) {
            Edited = true;
            Log.w("onTextChanged","Here");
        }
    });
}

<EditText
        android:id="@+id/stitchnotes"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="left"
        android:hint="@string/hint"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:inputType="text"
        android:visibility="invisible"
        android:textSize="30dip" />

в тот момент, когда я открываю Fragment, Edited имеет значение true, и LogCat записывается. Я не хочу этого. Я хочу!--23--> установить значение true только тогда, когда пользователь фактически вводит что-то в EditText. Что я делаю не так?

4 ответов


сделать свой EditText член класса. Или сделайте View член класса и вызов findViewById позже.

public class MyFragment extends Fragment {

    private EditText notes;

    @Override
    public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle     savedInstanceState) {
        View view = inflater.inflate(R.layout.detailfragment, container, false);
        notes = (EditText)view.findViewById(R.id.stitchnotes);
        // your other stuff
        return view;
    }

    @Override
    public void onResume() {
        super.onResume();
        notes.setText("Now I can access my EditText!");
    }

    ...

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

 editQty.setTag(false);
    editQty.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            editQty.setTag(true);
        }
    });
    editQty.addTextChangedListener(new TextWatcher() {

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

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {
            if (!s.toString().equals("") && (Boolean) editQty.getTag()) {
               // Do your Logic here
                }
            }
        }
    });

общедоступный класс FeedbackFragment расширяет SherlockFragment {

private EditText mEtFeedback;
CustomTextWatcher obj;


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

view = inflater.inflate(R.layout.fragment_feedback_layout, container, false);
initUIComponents();
obj=new CustomTextWatcher();
mEtFeedback.addTextChangedListener(obj);

return view;
}



@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
mEtFeedback.removeTextChangedListener(obj);

}

@Override
public void onClick(View v) {
switch (v.getId()) {

default:
    break;
}

}
class CustomTextWatcher implements TextWatcher {



    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    // TODO Auto-generated method stub

    }

    @Override
    public void afterTextChanged(Editable s) {
    // TODO Auto-generated method stub

    }


}

}


Маленький И Простой

в основном в этом случае, когда фрагмент загружает последовательность символов onTextChanged, возвращает"", которая не является пустой строкой, поэтому это даст вам лучшую идею

myEditText.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {



            if (!s.toString().isEmpty()) {

               //control come here when user enter some string to edit text

            } else {

                  //When fragment loads control comes here but below condition prevents execution because s.toString() give ""

                if (!s.toString().equals("")) {




                }

            }
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });