You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

输入NIK字段完成后自动在TextView中显示对应NAMA的实现方法

实现EditText输入NIK后自动加载对应NAMA到TextView的正确方案

需求说明

我有EditText和TextView组件,EditText用于输入NIK,TextView用于显示对应的NAMA。需求是输入完成NIK后,自动从数据库获取匹配的NAMA并显示到TextView中,目前不清楚正确的实现方式。

数据库结构

NIKNAMA
96296Farrasta
94878Alfian

现有代码

EditText监听代码

etNik.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) {
        String data = etNik.getText().toString();
        if (data == NikKry){
            getNama();
        }
    }

    @Override
    public void afterTextChanged(Editable s) {

    }
});

获取NAMA的函数

private void getNama(){
    APIRequestData armNama = RetroMaster.konekRetrofit().create(APIRequestData.class);
    Call<List<DataMaster>> tampilNama = armNama.ardGetNama(NikKry);

    tampilNama.enqueue(new Callback<List<DataMaster>>() {
        @Override
        public void onResponse(Call<List<DataMaster>> call, Response<List<DataMaster>> response) {
            if (response.isSuccessful()) {
                tvNama.setText(response.body().get(0).getNAMA());
            }
        }
        @Override
        public void onFailure(Call<List<DataMaster>> call, Throwable t) {
            Toast.makeText(TambahActivity.this, "Gagal "+t.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });
}

现有代码问题分析

  1. 字符串比较错误:Java中用==比较字符串是对比对象引用,不是内容,应该用equals()或equalsIgnoreCase()。
  2. 触发时机不合理:onTextChanged会在输入过程中每次字符变化都触发,容易导致频繁接口请求,应该在输入完成后再触发。
  3. 空数据处理缺失:response.body()或返回的列表可能为空,直接get(0)会引发空指针异常。
  4. 变量传递错误:getNama()中使用的NikKry未同步为当前输入的NIK值,需要将输入的NIK作为参数传入函数。

修正后的实现方案

方案1:输入框失去焦点时触发查询

适合输入完成后点击其他区域触发的场景:

etNik.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (!hasFocus) {
            String inputNik = etNik.getText().toString().trim();
            if (!inputNik.isEmpty()) {
                getNama(inputNik);
            } else {
                tvNama.setText(""); // 清空显示
            }
        }
    }
});

方案2:输入固定长度NIK后自动触发(假设NIK为5位)

适合NIK长度固定的场景:

etNik.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) {
        String inputNik = s.toString().trim();
        // 输入长度符合NIK规则时触发查询
        if (inputNik.length() == 5) {
            getNama(inputNik);
        } else if (inputNik.length() < 5) {
            tvNama.setText(""); // 长度不足时清空显示
        }
    }

    @Override
    public void afterTextChanged(Editable s) {}
});

修正后的getNama函数

private void getNama(String nik) {
    APIRequestData armNama = RetroMaster.konekRetrofit().create(APIRequestData.class);
    Call<List<DataMaster>> tampilNama = armNama.ardGetNama(nik);

    tampilNama.enqueue(new Callback<List<DataMaster>>() {
        @Override
        public void onResponse(Call<List<DataMaster>> call, Response<List<DataMaster>> response) {
            if (response.isSuccessful() && response.body() != null && !response.body().isEmpty()) {
                tvNama.setText(response.body().get(0).getNAMA());
            } else {
                tvNama.setText("未找到匹配的NAMA"); // 无匹配数据时提示
            }
        }

        @Override
        public void onFailure(Call<List<DataMaster>> call, Throwable t) {
            Toast.makeText(TambahActivity.this, "获取数据失败:" + t.getMessage(), Toast.LENGTH_SHORT).show();
            tvNama.setText("");
        }
    });
}

额外优化建议

  • 添加加载状态:请求接口时显示ProgressBar,避免用户重复操作。
  • 防抖处理:如果使用实时输入监听,添加500ms左右的延迟触发,减少无效接口请求。
  • 输入验证:检查输入的NIK是否为纯数字,避免非法请求。

内容的提问来源于stack exchange,提问作者Farrasta K S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 19:55:34