android - 使用动态生成的 AutoCompleteTextView 上的 setSelection 设置光标位置
问题描述
我正在开发一个使用 TableLayout 的项目,用户可以在表格布局中添加一个新行。每个新行都膨胀为一个新视图,然后将该视图添加到表格布局中。该行中的控件之一是 AutoCompleteTextView。
用户可以开始输入 AutCompleteTextView 然后选择建议列表中的项目之一,当用户选择项目时,所选项目按预期添加到文本框中,但我想将光标位置设置为然后用户可以更改文本的值。例如,选定的项目可能是sometext()
,但他们可以在选择它后修改文本成为sometext(25)
,所以我试图将光标的位置设置在括号内。
这对于布局中的一个 AutoCompleteTextView 来说工作得很好,但是当它动态生成时我不知道该怎么做。
我正在从膨胀的布局中找到 AutoCompleteTextView 并在项目单击侦听器上创建一个集合,并使用view
OnItemClick 函数中的参数来确保我使用的是触发事件处理程序的正确视图,但是在 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()
方法。
解决方案
view
inonItemClick()
是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);
}
}
});
}
});
您可以删除其他听众。
推荐阅读
- racket - 如何在球拍中使用带有变量的地图函数(定义)
- select - .net 核心中的 react-select 库依赖项
- spring-cloud-gateway - Spring Cloud Gateway 返回“索引 5 处的方案名称中的非法字符”
- azure-devops - ado yaml:是否可以在每次运行的基础上选择执行哪个阶段的作业?
- javascript - 通过 Flask 缓存或 POST 请求更改执行实时更新
- c# - 试图在我的游戏中实现缩放功能,但它不会取消缩放
- excel - 如何同时使用 `FileSystemObject.CreateFolder` 创建文件夹和子文件夹
- html - 填充动态 flexbox 或网格中剩余的空白行空间
- python - 如何从 mssql 表中加载列表?
- java - Spring-Boot:不尊重 Jackson 序列化配置