2012-10-03 2 views
0

나는 20 EditTexts과 함께 활동하고 있습니다. 아무 것도 입력되지 않았다면 메시지를 표시하고 싶습니다. 각 필드에 20 개의 리스너를 연결하는 대신 입력이 제공되었는지 (데이터가 변경되었는지) 확인할 수있는 방법이 있습니까?사용자가 필드 수신기없이 입력을했는지 어떻게 알 수 있습니까?

+1

가장 간단한 방법은 'EditTexts'에 하나의'TextWatcher'를 첨부하고'afterTextChanged' 메소드에서 텍스트를 얻는 것을 볼 수 있다면'EditTexts' 중 하나에 입력 한 것을 알 수 있습니다. – Luksprog

+0

내 질문에 명시된 것처럼 모든 필드 수신기를 포함하지 않는 솔루션을 찾고 있습니다. 예를 들어, 활동에 대한 일반적인 청취자가 변경 될 수 있습니까? 키보드 입력 등? – Snake

답변

1

어떻게 보일지의 생각이다. 사용자가 무언가를 입력 할 때 수행하려는 작업에 따라 특정 사례에 맞게 예제를 변경해야 할 수 있습니다. 당신이 상속됩니다있는

자료 활동

public abstract class BaseTextWatcherActivity extends Activity { 

    private TextWatcher mInputObserver = new 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) { 
     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      onInputChange(s.toString()); 
     } 
    }; 
    private boolean mOptimize = false; 

    @Override 
    public void setContentView(int layoutResID) { 
     View content = getLayoutInflater().inflate(layoutResID, null); 
     initInputsObservers((ViewGroup) content); 
     mOptimize = true; 
     super.setContentView(content); 
    } 

    @Override 
    public void setContentView(View view) { 
     if (view instanceof EditText) { 
      ((EditText) view).addTextChangedListener(mInputObserver); 
     } else if (view instanceof ViewGroup && !mOptimize) { 
      initInputsObservers((ViewGroup) view); 
      mOptimize = false; 
     } 
     super.setContentView(view); 
    } 

    /** 
    * Implement this method to allow your activities to get notified when one 
    * of their {@link EditText} widgets receives input from the user. 
    * 
    * @param s the string that was entered by the user in one of the EditTexts. 
    */ 
    public abstract void onInputChange(String s); 

    /** 
    * This will recursively go through the entire content view and add a 
    * {@link TextWatcher} to every EditText widget found. 
    * 
    * @param root 
    *   the content view 
    */ 
    private void initInputsObservers(ViewGroup root) { 
     final int count = root.getChildCount(); 
     for (int i = 0; i < count; i++) { 
      final View child = root.getChildAt(i); 
      if (child instanceof EditText) { 
       ((EditText) child).addTextChangedListener(mInputObserver); 
      } else if (child instanceof ViewGroup) { 
       initInputsObservers((ViewGroup) child); 
      } 
     } 
    } 

} 

그런 다음 당신이 당신의 활동에해야 할 일은 당신이 사용자가에서 EditTexts 중 하나에 뭔가를 입력 있음을 알려하는 onInputchange 콜백을 구현한다 현재 레이아웃. 액티비티 클래스의 키 이벤트 콜백을 좀 더 단순하게 보길 원할 수도 있습니다. 그러나 내가 잘못 입력하지 않은 경우 해당 이벤트는 TextView/EditText 위젯에서 사용됩니다.

+0

Perfect !!!! 정확히 내가 찾고있는 것. 나는 오늘 그것을 시도 할 것이다. – Snake

0

귀하의 TextViews는 모두 addTextChangedListener()을 호출하여 귀하의 활동을 인수로 부여합니다 (this). 액티비티에 TextWatcher을 구현하고 afterTextChanged()를 재정의하십시오. TextView 중 하나가 변경 될 때마다 afterTextChanged()가 호출됩니다. 다음은 여기에 (있는 경우) 자신의 EditText 위젯 중 하나를 사용하는 경우 서브 클래스를 통지 돌봐 기본 클래스의 예입니다 코드가

public class YouActivity extends Activity implements TextWatcher{ 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
[...] 

textView1.addTextChangedListener(this); 
textView2.addTextChangedListener(this); 
[...] 
} 

@Override 
public void afterTextChanged (Editable s) 
{ 
    //do something 
} 

} 
+0

내 질문에 명시된 것처럼 모든 필드 수신기를 포함하지 않는 솔루션을 찾고있었습니다. 예를 들어, 활동에 대한 일반적인 청취자가 변경 될 수 있습니까? 키보드 입력 등? – Snake

+0

리스너가 없으면보기가 변경되었는지 알 수 없습니다. 키보드를 듣고 있습니까? 옵션이지만 단추를 누를 때마다 알림이 전송됩니다 (TextView 내에서 필요하지 않음). 리스너를 사용하고 싶지 않은 이유가 있습니까? –

+0

textwatcher를 사용하여 edittext에 입력되는 모든 글자에 대한 알림을 받게됩니다. lsitener를 사용하고 싶지 않은 이유는 10 가지 이상의 활동이 있고 각 활동에 edittext와 spinners가 있기 때문입니다. 나는이 모든 활동들이 확장 된 기초 활동을 만들고 싶었고 그 기본 활동 내에서 "기초적인 활동"중 하나가 변경된 경우 메시지를 표시 할 수있는 "무언가"를했습니다. – Snake

관련 문제