首页 > 解决方案 > 使用动态生成的 AutoCompleteTextView 上的 setSelection 设置光标位置

问题描述

我正在开发一个使用 TableLayout 的项目,用户可以在表格布局中添加一个新行。每个新行都膨胀为一个新视图,然后将该视图添加到表格布局中。该行中的控件之一是 AutoCompleteTextView。

用户可以开始输入 AutCompleteTextView 然后选择建议列表中的项目之一,当用户选择项目时,所选项目按预期添加到文本框中,但我想将光标位置设置为然后用户可以更改文本的值。例如,选定的项目可能是sometext(),但他们可以在选择它后修改文本成为sometext(25),所以我试图将光标的位置设置在括号内。

这对于布局中的一个 AutoCompleteTextView 来说工作得很好,但是当它动态生成时我不知道该怎么做。

我正在从膨胀的布局中找到 AutoCompleteTextView 并在项目单击侦听器上创建一个集合,并使用viewOnItemClick 函数中的参数来确保我使用的是触发事件处理程序的正确视图,但是在 setSelection 我得到一个异常java.lang.ClassCastException: android.support.v7.widget.AppCompatTextView cannot be cast to android.widget.AutoCompleteTextView

下面是我正在使用的代码:

private void addRow()
    {
        TableRow row = (TableRow)LayoutInflater.from(this).inflate(R.layout.create_table_column_row, createTable, false);
        txtColumnName = row.findViewById(R.id.txtColumnName);
        txtDataType = row.findViewById(R.id.txtDataType);
        txtDataType.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                txtDataType.showDropDown();
            }
        });
        txtDataType.setOnItemClickListener(new AdapterView.OnItemClickListener()
        {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id)
            {
                String selectedItem = parent.getItemAtPosition(position).toString();
                //Check if the string has a ( and if so, set the cursor to be just after it so the user can enter the size
                int bracketPos = selectedItem.indexOf("(");
                if (bracketPos > 0)
                {
                    //Crashes on this line
                    ((AutoCompleteTextView)view).setSelection(bracketPos+1);
                }
            }
        });

        List<String> datatypes = Arrays.asList(getResources().getStringArray(R.array.table_datatypes));
        datatypeAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, datatypes);
        txtDataType.setAdapter(datatypeAdapter);
        rowViews.add(row);
        createTable.addView(row);
    }

我尝试将视图投射到 AppCompatTextView 但是这没有setSelection()方法。

标签: android

解决方案


viewinonItemClick()AppCompatTextView在下拉框中单击的AutoCompleteTextView。这就是为什么你不能施放它。

由于您有多个AutoCompleteTextViews,请使用焦点更改侦听器来捕获AutoCompleteTextView用户正在解决的问题。然后,您可以使用该值来设置光标的位置。

private AutoCompleteTextView textView;
private AutoCompleteTextView mAuto;

textView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        mAuto = (AutoCompleteTextView) v;
    }
});

textView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Log.d("MainActivity", "<<<<onItemClicked");
        int bracketPos = textView.getText().toString().indexOf("(");
        if (bracketPos > 0) {
            mAuto.setSelection(bracketPos + 1);
        }
    }
});

我相信AutoCompleteTextView调用此方法时已经填充了 ,因此您只需(在该字段中搜索即可。


这是一种稍微不同的方式。后

txtDataType = row.findViewById(R.id.txtDataType);

添加

txtDataType.setOnClickListener(new View.OnClickListener() {
    private AutoCompleteTextView mAutoView;

    @Override
    public void onClick(View v) {
        mAutoView = (AutoCompleteTextView) v;
        mAutoView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Log.d("MainActivity", "<<<<onItemClicked");
                int bracketPos = mAutoView.getText().toString().indexOf("(");
                if (bracketPos > 0) {
                    mAutoView.setSelection(bracketPos + 1);
                }
            }
        });
    }
});

您可以删除其他听众。


推荐阅读