gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 23:35:41 25 4
gpt4 key购买 nike

我正在处理一个使用 TableLayout 的项目,用户可以向表格布局添加新行。每个新行都被扩展为一个新 View ,然后该 View 被添加到表布局中。该行中的控件之一是 AutoCompleteTextView。

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

这对于布局中的一个 AutoCompleteTextView 来说工作正常,但我无法弄清楚当它动态生成时该怎么做。

我正在从展开的布局中找到 AutoCompleteTextView 并创建一组项目点击监听器,并使用 OnItemClick 函数中的 view 参数来确保我使用的是触发事件的正确 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);
}

我尝试将 View 转换到 AppCompatTextView,但它没有 setSelection() 方法。

最佳答案

onItemClick()中的viewAutoCompleteTextView下拉框中点击的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);
}
}
});
}
});

您可以删除其他监听器。

关于android - 在动态生成的 AutoCompleteTextView 上使用 setSelection 设置光标位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52280901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com