为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用文本观察器为表单中的多个字段更新进度条?

如何使用文本观察器为表单中的多个字段更新进度条?

眼眸繁星 2021-12-01 18:53:23
我有一堆字段:名字、姓氏、电子邮件、密码,每次有有效条目时我都需要更新进度条。因此,例如,如果填写了电子邮件地址和姓氏,ProgressBar则应为 50%。用户可以按任何顺序输入字段,但ProgressBar应始终显示更新的进度级别。我正在使用addTextChangeListener(Text Watcher).firstName.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) {            int length = s.toString().trim().length();            if (length > 0) {                registrationProgress.setProgress(registrationProgress.getProgress() + 25);            } else {                registrationProgress.setProgress(registrationProgress.getProgress() - 25);            }        }        @Override        public void afterTextChanged(Editable s) {        }    });当我运行上面的代码时,我会ProgressBar继续为每个文本条目添加 25,而不是在填充整个字段并且用户从该字段中取出时。我做错了什么,我该怎么办?
查看完整描述

3 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

当我运行上面的程序时,我会看到进度条继续在每个文本条目中添加 25 [...] 我做错了什么?


TextWatcher 的 onTextChanged、beforeTextChanged 和 afterTextChanged 之间的差异将帮助您了解为什么您的应用会出现这种行为。


我该怎么办?


您可以覆盖afterTextChanged()而不是onTextChanged()因为您对用户键入字母(或按退格键)的频率不感兴趣。在 中afterTextChanged(),您评估到目前为止String已输入的 的长度EditText。


为了跟踪进度,我想介绍一个


private SparseBooleanArray isTextComplete = new SparseBooleanArray();

以及一种方法


private void checkProgress(){

    int progress = 0;

    for(int i = 0; i <  isTextComplete.size(); i++){

        if(isTextComplete.valueAt(i)){

            progress++;

        }

    }

    registrationProgress.setProgress(progress * 25);

}

在 中afterTextChanged(),您可以更新SparseBooleanArray并调用checkProgress():


@Override

public void afterTextChanged(Editable s) {

    int len = etMail.getText().toString().length();

    if(len > 0){

        isTextComplete.put(etMail.getId(), true);

    }

    else{

        isTextComplete.put(etMail.getId(), false);

    }

    checkProgress();

}


查看完整回答
反对 回复 2021-12-01
?
当年话下

TA贡献1890条经验 获得超9个赞

当我运行上面的时候,我得到了进度条,继续为每个文本添加 25


这是因为您正在使用以下代码(请阅读评论):


@Override

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

    int length = s.toString().trim().length();


    // if string not empty, keep adding the progress with 25

    if (length > 0) {

        registrationProgress.setProgress(registrationProgress.getProgress() + 25);

    } 

    // subtract 25 each time string empty.

    else {

        registrationProgress.setProgress(registrationProgress.getProgress() - 25);

    }


}

你可以看到如果有非空字符串,你总是加 25,如果没有找到非空字符串,你总是减去 25。


要解决此问题,您需要对名字、姓氏、电子邮件、密码中的每个文本更改进行跟踪。您可以将 HashMap 与 Enum 结合使用。像这样的东西:


public YourActivity extends AppCompatActivity {


   ...


   // this is the list of entry

   private enum Entry {

     FIRST_NAME, LAST_NAME, EMAIL, PASSWORD

   }


   // keep tracking the entry where Boolean is the value if entry already inserted

   private HashMap<Entry, Boolean> mMapEntries = new HashMap<>();


   private void checkAndValidateEntries() {

     // initialize the entry as not inserted yet

     mMapEntries.put(FIRST_NAME, false);

     mMapEntries.put(LAST_NAME, false);

     mMapEntries.put(EMAIL, false);

     mMapEntries.put(PASSWORD, false);



     // then handle the entry view

     // here the example only for firstname

     firstName.addTextChangedListener(new TextWatcher() {

        ...


        @Override

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

            int length = s.toString().trim().length();

            if (length > 0) {

               boolean isInserted = mMapEntries.get(FIRST_NAME);

               // do changes if entry not yet inserted before.

               if(isInserted == false) {

                  // progress percentage per entry

                  int percentage = 100 / mMapEntries.size();


                  // add the progress

                  int progress = registrationProgress.getProgress() + percentage;

                  registrationProgress.setProgress(progress);


                  // we now have inserted the value, so mark it.

                  mMapEntries.put(FIRST_NAME, true);

               }

            } else {

               boolean isInserted = mMapEntries.get(FIRST_NAME);

               // Do changes if entry already inserted before.

               if(isInserted == true) {

                  int percentage = 100 / mMapEntries.size();


                  // subtract the progress.

                  int progress = registrationProgress.getProgress() - percentage;

                 registrationProgress.setProgress(progress);


                 // entry is removed, mark as not inserted yet

                 mMapEntries.put(FIRST_NAME, false);

               }

            }


        }


        ...

     });



     // handle the last name, e-mail, password

     ...

   }


}

上面的代码只会在条目进度没有添加到之前的进度中时才会增加进度值,反之亦然。


查看完整回答
反对 回复 2021-12-01
?
皈依舞

TA贡献1851条经验 获得超3个赞

问题是每次字段文本更改时都会添加 25。例如,如果你写“你好”,你有五个字母,所以onTextChanged会被触发 5 次。

一个可能的工作区是为每个字段创建标志,仅boolean用于指示该字段是否已填充。然后您检查有多少标志设置为“已填充”并相应地设置ProgressBar

希望能帮助到你。


查看完整回答
反对 回复 2021-12-01
  • 3 回答
  • 0 关注
  • 147 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信