在 Android 中设置微调器ClickListener()

2022-09-01 02:48:10

我试图让一个 onClickListener 在 Spinner 上触发,但我得到以下错误:

Java.lang.RuntimeException 是 “Don't call setOnClickListener for a AdapterView.你可能想要 setOnItemClickListener 来代替,”

我确定我想调用 onClickListener 而不是 onItemClickListener。我发现其他人在Stack Overflow上问了一个问题,有没有办法将setOnClickListener与Android Spinner一起使用?

答案是:

您必须在基础视图(通常是带有id:android的TextView)上设置Click侦听器。R.id.text1) 的微调器。为此,请执行以下操作:

创建自定义微调器 在构造函数(带有属性)中,通过提供布局 android 来创建微调器。R.layout.simple_spinner_item Do a findViewById(android.R.id.text1) 获取 TextView Now 将 onClickListener 设置为 TextView

我已经尝试了那里记下的答案,但它似乎不起作用。我在执行findViewById()后得到一个指向TextView的空指针。

这就是我正在做的:

Spinner spinner = (Spinner) findViewById(R.id.spinner);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.layoutspinner,dataArray);

spinner.setAdapter(adapter);

TextView SpinnerText = (TextView)findViewById(R.id.spinnerText);
if (SpinnerText == null) {
    System.out.println("Not found");
}
else {
    SpinnerText.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View arg0) {
            //Do something
        }
    });
}

文件布局旋转器.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
                  android:id="@+id/spinnerText"
                  android:singleLine ="true"
                  android:layout_width="fill_parent"
                  android:layout_height="wrap_content"
                  android:textSize="6pt"
                  android:gravity="right"/>

我做错了什么?

我是Stack Overflow的新手,我没有找到任何方法将附加问题发布到另一个线程(或评论,因为我必须很少代表),所以我开始了一个新问题。

根据建议,我尝试了这个:

int a = spinnerMes.getCount();
int b = spinnerMes.getChildCount();
System.out.println("Count = " + a);
System.out.println("ChildCount = " + b);
for (int i = 0; i < b; i++) {
    View v = spinnerMes.getChildAt(i);
    if (v == null) {
        System.out.println("View not found");
    }
    else {
        v.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Click code
            }
        });
    }
}

LogCat并没有显示出有希望的结果。

10-14 16:09:08.127: INFO/System.out(3116): Count = 7
10-14 16:09:08.127: INFO/System.out(3116): ChildCount = 0

我已经在API级别7和8上进行了测试,结果相同。


答案 1

这是一个可行的解决方案:

我们不是设置微调器的 OnClickListener,而是设置 OnTouchListener 和 OnKeyListener。

spinner.setOnTouchListener(Spinner_OnTouch);
spinner.setOnKeyListener(Spinner_OnKey);

和听众:

private View.OnTouchListener Spinner_OnTouch = new View.OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            doWhatYouWantHere();
        }
        return true;
    }
};
private static View.OnKeyListener Spinner_OnKey = new View.OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
            doWhatYouWantHere();
            return true;
        } else {
            return false;
        }
    }
};

答案 2

每当您必须在Android中单击微调器时执行某些操作时,请使用以下方法。

mspUserState.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            doWhatIsRequired();
        }
        return false;
    }
});

要记住的一件事是在使用上述方法时始终返回False。如果要返回 True,则在单击微调器时将不会显示微调器的下拉项。