如何在 Android 中为微调器捕获 onClick 事件
Posted
技术标签:
【中文标题】如何在 Android 中为微调器捕获 onClick 事件【英文标题】:How to capture onClick event in Android for a spinner 【发布时间】:2012-04-30 01:53:04 【问题描述】:我想在用户选择微调器值时捕获 onClick 事件。
我已经尝试实现OnClickListener
并使用以下代码:
@Override
public void onClick(final View view)
if (view == countrySpinner)
Toast.makeText(this, "Override OK!", 3);
并绑定:
countrySpinner.setOnClickListener(this);
这可以编译,但我收到了一个RuntimeException
,建议我使用OnItemClickListener
而不是OnClickListener
作为AdapterView
。
如何捕获该 onClick 事件?
【问题讨论】:
Spinner
不支持点击事件,因为异常清楚地告诉您。要么使用选择事件,要么不使用Spinner
。
@CommonsWare,那么我将如何不急于从 Web 服务加载 Spinner 列表项呢?是不是不可能做到这一点? (似乎是一个很大的限制!)
将内容加载到Spinner
与单击事件无关,就像生成网页与在浏览器中加载后单击页面本身的链接有关。我不知道你认为“热切”是什么。如果您对填写 Spinner
有任何疑问,请打开一个新的 SO 问题。
正如 CommonsWare 所说,您无需等到用户单击您的微调器来填充它。您可以通过设置 ArrayAdapter 来填充它。那里有教程,还有一个here(尽管他们使用本地资源来填充微调器)。只需通过网络电话获取您的微调器项目,然后创建一个 ArrayAdapter。
【参考方案1】:
尝试设置 OnTouchListener 和 OnKeyListener,而不是设置微调器的 OnClickListener。
spinner.setOnTouchListener(spinnerOnTouch);
spinner.setOnKeyListener(spinnerOnKey);
和听众:
private View.OnTouchListener spinnerOnTouch = new View.OnTouchListener()
public boolean onTouch(View v, MotionEvent event)
if (event.getAction() == MotionEvent.ACTION_UP)
//Your code
return false;
;
private static View.OnKeyListener spinnerOnKey = new View.OnKeyListener()
public boolean onKey(View v, int keyCode, KeyEvent event)
if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER)
//your code
return true;
else
return false;
;
【讨论】:
您的代码会消耗所有触摸和按键事件,从而使Spinner
完全无法使用。如果这是目标,OP 应该简单地使用Button
。
@CommonsWare 我希望这现在可以工作......我错误地在 onTouchListener 中返回了 true。应该是假的
我怀疑这会有所帮助。如果您希望超类具有其正常行为,请链接到超类。
我检查了它,它正在为我工作。 Spinner 行为正常
@CommonsWare:这正是我想要的。 Button
看起来不像一个微调器。【参考方案2】:
不要将微调器视为按钮,按钮具有 onClick 事件。微调器有 onItemSelected 事件。
您应该像这样捕获 Spinner 的 onItemSelected 事件:
import android.widget.AdapterView;
Spinner productname_spinner =(Spinner) findViewById(R.id.your_spinner);
productname_spinner.setOnItemSelectedListener(
new AdapterView.OnItemSelectedListener()
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id)
Object item = parent.getItemAtPosition(pos);
System.out.println(item.toString()); //prints the text in spinner item.
public void onNothingSelected(AdapterView<?> parent)
);
在 Kotlin 中,类似于以下内容:
mySpinner.onItemSelectedListener = object: OnItemSelectedListener
override fun onNothingSelected(parent: AdapterView<*>?)
// Do nothing
override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long)
val selection = parent?.getItemAtPosition(position)
viewModel.updateSelection(selection as String)
【讨论】:
【参考方案3】:我尝试使用以下代码实现 OnItemSelectedListener
以获取 Selected Spinner Value :
String selectAreaNameString;
AreaSpinner.setOnItemSelectedListener(AreaSpinnerSelected = new AdapterView.OnItemSelectedListener()
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id)
Object item = parent.getItemAtPosition(pos);
selectAreaNameString = item.toString();
);
【讨论】:
以上是关于如何在 Android 中为微调器捕获 onClick 事件的主要内容,如果未能解决你的问题,请参考以下文章
Android - 如何在一个活动中禁用多个微调器的特定项目
如何在 doInBackgroung() 时制作 android AsyncTask 加载微调器