我正在一个使用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()
方法。
答案 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);
}
}
});
}
});
您可以删除其他侦听器。