Java 我可以在不同的EditText小部件上使用相同的TextWatcher吗

Java 我可以在不同的EditText小部件上使用相同的TextWatcher吗,java,android,listener,android-textwatcher,Java,Android,Listener,Android Textwatcher,我有一张表格。当用户在一些int字段中输入不同的值时,我想在“实时”中显示一个计算。我让我的活动实现TextWatcher接口,并在3个不同的EditText字段上设置了一个侦听器,但TextWatcher似乎只检测活动代码中声明的第一个EditText 您可以从下面的代码中看到,我试图获取一些字段,将它们转换为int,并在表单底部的EditText字段中显示输出。我哪里做错了?我是否需要在所有涉及的EditText字段上单独实现textWatcher?这将是一个相当冗长的解决方案,使我的代码比

我有一张表格。当用户在一些int字段中输入不同的值时,我想在“实时”中显示一个计算。我让我的活动实现TextWatcher接口,并在3个不同的EditText字段上设置了一个侦听器,但TextWatcher似乎只检测活动代码中声明的第一个EditText

您可以从下面的代码中看到,我试图获取一些字段,将它们转换为int,并在表单底部的EditText字段中显示输出。我哪里做错了?我是否需要在所有涉及的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) {

    }
}

根据我的经验,我在多个
EditText
上使用相同的
TextWatcher
时遇到问题。您可以创建一个方法,为每个
EditText
生成一个新的
TextWatcher
实例,从而避免代码过于冗长。试着这样做:

mPaperTargets.addTextChangedListener(createTextWatcher());
mSteelTargets.addTextChangedListener(createTextWatcher());
摆脱
为您的
活动
及其相关方法实现TextWatcher
。实现一个方法
createTextWatcher()

现在要这样使用它:

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

@Natan Felipe链接上投票最多的答案还演示了在多个
EditText
上使用一个
TextWatcher
实例。您可以创建一个方法,为每个
EditText
生成一个新的
TextWatcher
实例,从而避免代码过于冗长。试着这样做:

mPaperTargets.addTextChangedListener(createTextWatcher());
mSteelTargets.addTextChangedListener(createTextWatcher());
摆脱
为您的
活动
及其相关方法实现TextWatcher
。实现一个方法
createTextWatcher()

现在要这样使用它:

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

@Natan Felipe链接上投票最多的答案还演示了使用
TextWatcher
per
EditText

的一个实例,一个TextWatcher可以多个EditText,据我所知,这应该是您实现的方式。但是请注意mSteelTargets添加了两次观察者。@Laura我现在看到了。但这仍然没有完全解决我的问题,因为我还没有到达MSTELTargets。它只读取mpapertargets,对于单个textwatcher来说,它可以将EditText复制到多个文本中。据我所知,你可以从这个角度来看,它应该按照你实现的方式工作。但是请注意mSteelTargets添加了两次观察者。@Laura我现在看到了。但这仍然没有完全解决我的问题,因为我还没有到达MSTELTargets。它的意思只是感谢你简洁的回答。它如预期的那样工作,使我不用写很多代码。谢谢你简洁的回答。它按预期工作,使我免于编写大量代码