2017-10-10 11 views
1

양식이 있습니다. 사용자가 일부 int 필드에 다른 값을 입력하면 "실시간"으로 계산을 표시하려고합니다. 내 Activity가 TextWatcher 인터페이스를 구현하고 3 개의 다른 EditText 필드에서 Listener를 설정했지만 Textwatcher는 Activity 코드에 선언 된 첫 번째 EditText 만 감지합니다.다른 EditText 위젯에서 같은 TextWatcher를 사용할 수 있습니까

아래 코드에서 볼 수 있듯이 몇 가지 필드를 grab하고 int로 변환 한 다음 양식 맨 아래에있는 EditText 필드에 출력을 표시하려고합니다. 내가 어디로 잘못 가고 있니? 관련된 모든 EditText 필드에 대해 개별적으로 textWatcher를 구현해야합니까? 내가 여러 EditText에서 같은 TextWatcher를 사용하여 문제를 했어 내 경험에

public class NewStageFormActivity extends AppCompatActivity implements TextWatcher{ 

    Context mContext; 

    EditText mStageName, mPaperTargets, mHitsPerTarget, mSteelTargets, mSteelNPMs, mOutput; 
    Spinner mScoringType, mStrings; 
    CheckBox mNoShoots, mNPMs; 
    Button mSaveButton; 
    Match mGlobalMatch; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_stage_form); 

     mContext = this; 
     mGlobalMatch = GlobalMatch.getMatch(); 

     mStageName = (EditText)findViewById(R.id.stage_name_et); 
     mPaperTargets = (EditText)findViewById(R.id.paper_targets_et); 
     mHitsPerTarget = (EditText)findViewById(R.id.hits_per_target_et); 
     mSteelTargets = (EditText)findViewById(R.id.steel_targets_et); 
     mSteelNPMs = (EditText)findViewById(R.id.steel_npm_et); 
     mScoringType = (Spinner)findViewById(R.id.scoring_type_spinner); 
     mStrings = (Spinner)findViewById(R.id.strings_spinner); 
     mNoShoots = (CheckBox)findViewById(R.id.no_shoots_cb); 
     mNPMs = (CheckBox)findViewById(R.id.npm_cb); 
     mSaveButton = (Button)findViewById(R.id.save_button); 
     mOutput = (EditText)findViewById(R.id.output_et); 

     // paper * hitsPer + steel 
     mPaperTargets.addTextChangedListener(this); 
     mSteelTargets.addTextChangedListener(this); 
     mSteelTargets.addTextChangedListener(this); 

     mSaveButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if(mStageName.getText().toString().equals("") || mPaperTargets.getText().toString().equals("") || 
         mHitsPerTarget.getText().toString().equals("") || mSteelTargets.getText().toString().equals("") || 
         mSteelNPMs.getText().toString().equals("")){ 
        Toast.makeText(mContext, "You must fill in all form fields", Toast.LENGTH_SHORT).show(); 
       } else { 
        String name = mStageName.getText().toString(); 
        String type = mScoringType.getSelectedItem().toString(); 
        int strings = Integer.valueOf(mStrings.getSelectedItem().toString()); 
        int paperTargets = Integer.valueOf(mPaperTargets.getText().toString()); 
        int hitsPerTarget = Integer.valueOf(mHitsPerTarget.getText().toString()); 
        boolean noShoots; 
        boolean npms; 
        if(mNoShoots.isChecked()){ 
         noShoots = true; 
        } else { 
         noShoots = false; 
        } 
        if(mNPMs.isChecked()){ 
         npms = true; 
        } else { 
         npms = false; 
        } 
        int steelTargets = Integer.valueOf(mSteelTargets.getText().toString()); 
        int steelNPMs = Integer.valueOf(mSteelNPMs.getText().toString()); 

        MatchStage matchStage = new MatchStage(name, type, strings, paperTargets, hitsPerTarget, 
          noShoots, npms, steelTargets, steelNPMs); 

        mGlobalMatch.getStages().add(matchStage); 

        String jsonString = new Gson().toJson(mGlobalMatch); 
        MatchHelper.updateFile(mContext, MatchHelper.createFileName(mGlobalMatch.getMatchId()), 
          jsonString); 

        Intent intent = new Intent(mContext, StagesListActivity.class); 
        startActivity(intent); 
       } 
      } 
     }); 


    } 

    @Override 
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

    } 

    @Override 
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 


     int paper = Integer.valueOf(mPaperTargets.getText().toString()); 
     int hitsPer = Integer.valueOf(mHitsPerTarget.getText().toString()); 
     int steel = Integer.valueOf(mSteelTargets.getText().toString()); 

     int minRound = (paper * hitsPer) + steel; 
     int points = minRound * 5; 

     mOutput.setText("Minimum rounds: " + (minRound) + "\t\t Points: " + points); 
    } 

    @Override 
    public void afterTextChanged(Editable editable) { 

    } 
} 
+0

하나의 텍스트 워처에서 여러 개의 edittext를 찾으려면이 [link] (https://stackoverflow.com/questions/5702771/how-to-use-single-textwatcher-for-multiple-edittexts)에서 살펴볼 수 있습니다. –

+1

내가 아는 바로는 구현 한 방식대로 작동해야합니다. 그러나 mSteelTargets는 감시자를 2 번 추가합니다. – Laura

+0

@Laura 나는 그것을 지금 본다. 하지만 여전히 어쨌든 mSteelTargets에 결코 도달하지 않았기 때문에 여전히 내 문제를 해결하지 못했습니다. 그것은 단지 mPaperTargets을 읽습니다. –

답변

0

을 좋아하는 것보다 그게 훨씬 더 내 코드를 만드는 대신 자세한 해결책이 될 것입니다. 각 EditText에 대해 TextWatcher의 새 인스턴스를 생성하는 메서드를 만들어 코드가 모두 장황하지 않도록하여이 문제를 해결할 수 있습니다. 다음과 같이 시도하십시오.

Activity에 대해 implements TextWatcher을 없애고 관련된 방법입니다. 이처럼 사용하려면 지금

private TextWatcher createTextWatcher() { 
    return new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 
      // Copy your original code 
     } 

     @Override 
     public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 
      // Copy your original code 
     } 

     @Override 
     public void afterTextChanged(Editable editable) { 
      // Copy your original code 
     } 
    }; 
} 

: : 방법 createTextWatcher()를 구현

mPaperTargets.addTextChangedListener(createTextWatcher()); 
mSteelTargets.addTextChangedListener(createTextWatcher()); 

@Natan 펠리페의 링크에 가장-투표 대답은 또한 EditTextTextWatcher의 한 인스턴스를 사용하는 방법을 보여줍니다.

+0

간결한 답변에 감사드립니다. 예상대로 작동하여 많은 코드 작성을하지 않아도되었습니다. –