使用动态生成的自动完成文本视图上的 setSelect 设置光标位置



我正在处理一个使用TableLayout的项目,用户可以在表格布局中添加一个新行。每个新行都膨胀为一个新视图,然后将该视图添加到表布局中。行中的控件之一是自动完成文本视图。

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

这对于布局中的一个自动完成文本视图工作正常,但是当它动态生成时,我不知道该怎么做。

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

onItemClick()中的view是在AutoCompleteTextView的下拉框中单击的AppCompatTextView。这就是为什么你不能投射它。

由于您有多个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);
}
}
});
}
});

您可以删除其他侦听器。

最新更新