获取EditText时TextWatcher崩溃

时间:2018-08-07 14:31:12

标签: java android

输入后,它会提示我:您的应用没有响应。 您要关闭吗? 等待OK

我认为是由于edt_search.gettext().tostring()内的setData()

 private void setupViews() {
edt_search = findViewById(R.id.edt_search);
progress = findViewById(R.id.progress);
progress.hide();

edt_search.addTextChangedListener(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) {

  }

  @Override
  public void afterTextChanged(Editable editable) {
    if (editable.length() != 0) {
      setData();
    }
  }
});
}



private void setData() {
AndroidNetworking.post("uri")
  .addBodyParameter("word", edt_search.getText().toString())
  .build()
  .getAsObjectList(Search.class, new ParsedRequestListener<List<Search>>() {
    @Override
    public void onResponse(List<Search> searches) {
      for (Search search : searches) {
        searchList.add(search);
        adapter.notifyDataSetChanged();
      }
      loading(false);
    }

    @Override
    public void onError(ANError anError) {
      Log.e("android-networking", "error: " + anError.getLocalizedMessage());
    }
  });
}

1 个答案:

答案 0 :(得分:1)

您可能猜对了。根据经验,我发现在afterTextChanged方法内从EditText调用方法是有问题的(至少没有先删除文本监视程序)。如果可能的话,最好使用作为参数传递的Editable对象。因此,您可以尝试两种方法:

首先(最简单的方法,在这种情况下,我最推荐这样做):将字符串传递给setData()方法,因此您无需使用此方法访问EditText:

....

    @Override
    public void afterTextChanged(Editable editable) {
        if (editable.length() != 0) {
            setData(editable.toString());
        }
    }

....

private void setData(String searchString) {
AndroidNetworking.post("http://akhbaresteghlal.ir/search/getInformations.php")
  .addBodyParameter("word", searchString)
  .build()
....

第二个选项(如果出于任何原因,您绝对需要直接访问editText):在调用setData()(以及EditText中的任何方法)之前,请先删除TextWatcher,然后再添加它。

....

    @Override
    public void afterTextChanged(Editable editable) {
        if (editable.length() != 0) {
            edt_search.removeTextChangedListener(this);
            setData();
            edt_search.addTextChangedListener(this);
        }
    }

....

private void setData() {
    AndroidNetworking.post("http://akhbaresteghlal.ir/search/getInformations.php")
      .addBodyParameter("word", edt_search.getText().toString())
      .build()
    ....

希望有帮助!