如何在 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 - 如何在一个活动中禁用多个微调器的特定项目

如何在Android中将edittext与微调器合并?

如何在 doInBackgroung() 时制作 android AsyncTask 加载微调器

如何更改android微调器弹出动画

Android / Java - 如何在 listView 中找到微调器所在的行

Android:如何将微调器绑定到自定义对象列表?