开发者社区 问答 正文

使用Edittext实现搜索视图的功能

我在一个购物项目中工作,我想在EditText中创建动态的结束图标,当用户专注于EditText时,该图标会发生变化。

因此,基本上,在用户与editText交互之前,该图标在右侧显示“搜索”图标,而当用户单击并输入一些信息时,该图标将显示“清除”图标。

我仅实现了可绘制对象的可见功能。

edtSearch.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View view, boolean b)
            {
                if(b){
                    edtSearch.setCompoundDrawablesWithIntrinsicBounds(0,0,0,0);
                    edtSearch.setCompoundDrawablesWithIntrinsicBounds(0,0,R.drawable.ic_cancel_black_24dp,0);
                }
            }
        });

糟糕!如何处理搜索EditText的取消单击?

展开
收起
垚tutu 2019-11-29 23:08:26 665 分享 版权
阿里云 AI 助理回答

要处理EditText中动态显示搜索和清除图标的逻辑,您需要在获取焦点时显示清除图标,并在失去焦点或文本为空时恢复为搜索图标。同时,您还需要为清除图标添加点击监听器以清空EditText内容。以下是一个示例实现:

// 初始化一个点击监听器用于清除EditText内容
final View.OnTouchListener clearIconTouchListener = new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            edtSearch.setText(""); // 清空EditText
            edtSearch.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_search_black_24dp, 0); // 切换回搜索图标
        }
        return true;
    }
};

edtSearch.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View view, boolean hasFocus) {
        if (hasFocus) {
            // 当获得焦点且有文本时,显示清除图标并设置点击监听
            if (!edtSearch.getText().toString().isEmpty()) {
                edtSearch.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_cancel_black_24dp, 0);
                edtSearch.setCompoundDrawableTintList(ColorStateList.valueOf(ContextCompat.getColor(context, android.R.color.black))); // 如果需要改变颜色
                edtSearch.setOnTouchListener(clearIconTouchListener);
            } else {
                // 如果没有文本,则保持或显示搜索图标
                edtSearch.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_search_black_24dp, 0);
            }
        } else {
            // 失去焦点时,根据EditText是否有文本决定是否切换回搜索图标
            if (edtSearch.getText().toString().isEmpty()) {
                edtSearch.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_search_black_24dp, 0);
            }
            edtSearch.setOnTouchListener(null); // 移除触摸监听避免误触
        }
    }
});

这段代码首先定义了一个触摸监听器clearIconTouchListener,当用户点击清除图标时,它会清空EditText并切换回搜索图标。然后,在onFocusChange方法中,我们根据EditText是否获得焦点以及其内容是否为空来决定显示哪个图标,并在适当的时候应用这个触摸监听器。这样就实现了您所描述的功能。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答地址: