둘 이상의 EditText에 대한 TextWatcher
TextWatcher
둘 이상의 EditText
필드에 대한 인터페이스 를 구현하고 싶습니다 . 현재 사용하고 있습니다.
text1.addTextChangedListener(this);
text2.addTextChangedListener(this);
그런 다음 내 활동의 메서드를 재정의합니다.
public void afterTextChanged(Editable s) {}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
public void onTextChanged(CharSequence s, int start, int before, int count)
{
// do some operation on text of text1 field
// do some operation on text of text2 field
}
그러나 이것은 잘 작동하지만 현재 초점이 맞춰진 EditText
분야를 명시 적으로 식별 할 수 있도록 다른 방법을 찾고 있습니다 SoftKeyboard
.
에서 제안 된 솔루션 @Sebastian 로스의 대답은 한 인스턴스가 아닌 TextWatcher
일부 EditTexts
. n에 대한 하나의 클래스와 해당 클래스의 n 인스턴스입니다 EditTexts
.
각 EditText에는 고유 한 Spannable이 있습니다. TextWatcher
의 이벤트에는이 Spannable이 s
매개 변수로 있습니다. 나는 그들의 hashCode (각 객체의 고유 ID)를 확인합니다. myEditText1.getText ()는 해당 Spannable을 반환합니다. 그래서 경우 myEditText1.getText().hashCode()
에 등호 s.hashCode()
가 의미가 s
속한myEditText1
따라서 TextWatcher
일부 에 대해 하나의 인스턴스를 갖고 싶다면 EditTexts
다음을 사용해야합니다.
private TextWatcher generalTextWatcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
if (myEditText1.getText().hashCode() == s.hashCode())
{
myEditText1_onTextChanged(s, start, before, count);
}
else if (myEditText2.getText().hashCode() == s.hashCode())
{
myEditText2_onTextChanged(s, start, before, count);
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
if (myEditText1.getText().hashCode() == s.hashCode())
{
myEditText1_beforeTextChanged(s, start, count, after);
}
else if (myEditText2.getText().hashCode() == s.hashCode())
{
myEditText2_beforeTextChanged(s, start, count, after);
}
}
@Override
public void afterTextChanged(Editable s) {
if (myEditText1.getText().hashCode() == s.hashCode())
{
myEditText1_afterTextChanged(s);
}
else if (myEditText2.getText().hashCode() == s.hashCode())
{
myEditText2_afterTextChanged(s);
}
}
};
과
myEditText1.addTextChangedListener(generalTextWatcher);
myEditText2.addTextChangedListener(generalTextWatcher);
나는 다음과 같이 할 것입니다.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
EditText e = new EditText(this);
e.addTextChangedListener(new CustomTextWatcher(e));
}
private class CustomTextWatcher implements TextWatcher {
private EditText mEditText;
public CustomTextWatcher(EditText e) {
mEditText = e;
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
public void afterTextChanged(Editable s) {
}
}
"CustomTextWatcher"아이디어를 사용하여
1) 새로운 TextWatcherListener 인터페이스 생성 :
public interface TextWatcherExtendedListener extends NoCopySpan
{
public void afterTextChanged(View v, Editable s);
public void onTextChanged(View v, CharSequence s, int start, int before, int count);
public void beforeTextChanged(View v, CharSequence s, int start, int count, int after);
}
2) EditText 대신 EditTextExtended를 만들고 사용했습니다 (제 경우) :
public class EditTextExtended extends EditText
{
private TextWatcherExtendedListener mListeners = null;
public EditTextExtended(Context context)
{
super(context);
}
public EditTextExtended(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public EditTextExtended(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
}
public void addTextChangedListener(TextWatcherExtendedListener watcher)
{
if (mListeners == null)
{
mListeners = watcher;
}
}
public void removeTextChangedListener(TextWatcherExtendedListener watcher)
{
if (mListeners != null)
{
mListeners = null;
}
}
void sendBeforeTextChanged(CharSequence text, int start, int before, int after)
{
if (mListeners != null)
{
mListeners.beforeTextChanged(this, text, start, before, after);
}
}
void sendOnTextChanged(CharSequence text, int start, int before,int after)
{
if (mListeners != null)
{
mListeners.onTextChanged(this, text, start, before, after);
}
}
void sendAfterTextChanged(Editable text)
{
if (mListeners != null)
{
mListeners.afterTextChanged(this, text);
}
}
}
3) 따라서 다음 코드를 작성해야합니다.
myEditTextExtended.addTextChangedListener(this) //Let implement TextWatcherExtendedListener methods
4) 사용 :
@Override
public void onTextChanged(View v, CharSequence s, int start, int before, int count)
{
//Tested and works
//do your stuff
}
@Override
public void beforeTextChanged(View v, CharSequence s, int start, int count, int after)
{
//not yet tested but it should work
}
@Override
public void afterTextChanged(View v, Editable s)
{
//not yet tested but it should work
}
글쎄, 어떻게 생각하는지 알려주세요.
--편집하다--
afterTextChanged 비교 편집 가능 항목 만 사용하려는 경우 :
@Override
public void afterTextChanged(Editable editable) {
if (editable == mEditText1.getEditableText()) {
// DO STH
} else if (editable == mEditText2.getEditableText()) {
// DO STH
}
}
이 솔루션을 사용합니다.
리스너를 반환하는 메서드 추가 :
private TextWatcher getTextWatcher(final EditText editText) { return new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { // do what you want with your EditText editText.setText("blabla"); } @Override public void afterTextChanged(Editable editable) { } }; }
여러 EditText에 리스너를 추가하고 다른 매개 변수를 전달할 수도 있습니다.
editText1.addTextChangedListener(getTextWatcher(editText1)); editText2.addTextChangedListener(getTextWatcher(editText2)); editText3.addTextChangedListener(getTextWatcher(editText3));
또 하나의 방법은 주위에 추가하는 것입니다 OnClickListener
에 EditText
아래에 주어진 전역 변수를 설정
EditText etCurrentEditor;//Global variable
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(v instanceof EditText){
etCurrentEditor=(EditText)v;
}
}
이 etCurrentEditor를 현재 편집 된 EditText에 대한 참조로 사용하십시오.
@Override
public void afterTextChanged(Editable editable) {
// TODO Auto-generated method stub
switch (etCurrentEditor.getId()) {
case R.id.EDITTEXTID:
break;
default:
break;
}
}
예, .NET Framework TextWatcher
를 저장 하는 사용자 지정의 여러 인스턴스를 사용할 수 있습니다 TextView
. ( TextView
실제로있는 클래스입니다 addTextChangedListener
.)
위의 hashCode 솔루션과 유사하게 getText()==s
. 모든 컨트롤을 저장하거나 findViewById
여러 번 저장하는 대신 콘텐츠 트리에서 CharSequence
.
public TextView findTextView(View v, CharSequence s)
{
TextView tv;
ViewGroup vg;
int i, n;
if (v instanceof TextView)
{
tv = (TextView) v;
if (tv.getText()==s) return(tv);
}
else if (v instanceof ViewGroup)
{
vg = (ViewGroup) v;
n = vg.getChildCount();
for(i=0;i<n;i++)
{
tv = findTextView(vg.getChildAt(i), s);
if (tv!=null) return(tv);
}
}
return(null);
}
public void afterTextChanged(Editable s)
{
TextView tv=findTextView(findViewById(android.R.id.content), s);
if (tv==null) return;
switch(tv.getId())
{
case R.id.path:
break;
case R.id.title:
break;
}
}
물론 findTextView
inside beforeTextChanged
및 onTextChanged
.
모든 활동을위한 Global One 클래스.
CustomTextWatcher.java
package org.logicbridge.freshclub.customizedItems;
import android.content.Context;
import android.text.Editable;
import android.text.TextWatcher;
public class CustomTextWatcher implements TextWatcher {
private EditText mEditText;
Context context;
public CustomTextWatcher(EditText e, Context context) {
mEditText = e;
this.context = context;
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
public void afterTextChanged(Editable s) {
}
}
나는 그것을 다음과 같이 구현했다.
edittext1.addTextChangedListener(this);
edittext2.addTextChangedListener(this);
edittext3.addTextChangedListener(this);
과:
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
if(edittext1.hasFocus()){
//text changed for edittext1
}else if(edittext2.hasFocus()){
//text changed for edittext2
}else {
//text changed for edittext3
}
}
@Override
public void afterTextChanged(Editable editable) {
}
이를 달성하기 위해 여러 가지 방법을 시도한 후 EditText.isFocused()
서로를 구별 하는 데 사용하는 올바른 방법을 찾습니다 . 예를 들면 :
private class OnTextChangedListener implements TextWatcher {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
if (edtName.isFocused()) {
//do something
} else if (edtEmail.isFocused()) {
//do something
} else if (edtContent.isFocused()) {
//do something
}
}
}
메소드에 TextWatcher
대한 매개 변수로 항상 정의 addTextChangedListener
할 수 있습니다. 이렇게하면 각 편집 텍스트에 대해 여러 정의를 가질 수 있습니다.
hashCode () 메서드를 사용하여 편집 텍스트와 문자열의 해시 코드를 비교하십시오.
@Override
public void afterTextChanged(Editable s) {
if (editext.getText().hashCode() == s.hashCode()){
type1Total(type1List);
}
}
이것이 내가 한 일입니다 ...
private TextWatcher textWatcher = 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 (editText1.getText().length() > 0
&& editText2.getText().length() > 0
&& editText3.getText().length() > 0) {
button.setEnabled(true);
} else {
button.setEnabled(false);
}
}
@Override
public void afterTextChanged(Editable s) {
}
그런 다음 onCreate 메서드의 각 EditText에 TextWatcher를 추가하고 여기에 기본적으로 setEnabled (false) 버튼도 유지했습니다.
button.setEnabled(false);
editText1.addTextChangedListener(textWatcher);
editText2.addTextChangedListener(textWatcher);
editText3.addTextChangedListener(textWatcher);
편집 텍스트의 ID를 얻기 위해이 작업을 수행 할 수 있습니다. 테스트되지 않았지만 작동하는지 알려주십시오.
//setting textWatcher for the editText
textWatcher(owner_name);
public void textWatcher(final EditText editText){
TextWatcher watcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(editText.getId()==R.id.your_id){
//Do something
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
if(editText.getId()==R.id.your_id){
//Do something
}
}
@Override
public void afterTextChanged(Editable s) { }
};
editText.addTextChangedListener(watcher);
}
참고 URL : https://stackoverflow.com/questions/4283062/textwatcher-for-more-than-one-edittext
'program story' 카테고리의 다른 글
UIActivityViewController에서 메일 제목을 설정하는 방법은 무엇입니까? (0) | 2020.11.19 |
---|---|
iOS UILabel에 왼쪽 패딩 추가 (0) | 2020.11.19 |
두지도 병합 (0) | 2020.11.19 |
NLTK 데이터 다운로드 중 SSL 오류 (0) | 2020.11.19 |
HTML5 iFrame Seamless 속성 (0) | 2020.11.19 |