使用动态生成的AutoCompleteTextView上的setSelection设置光标位置

时间:2018-09-11 17:04:36

标签: android

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

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

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

我从膨胀的布局中找到AutoCompleteTextView,并在项目单击侦听器上创建了一个集合,并使用OnItemClick函数中的view参数来确保我使用了触发事件处理程序的正确视图,但是在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()方法。

1 个答案:

答案 0 :(得分:1)

view中的onItemClick()是在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);
                }
            }
        });
    }
});

您可以删除其他侦听器。