Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Setting a spinner onClickListener() in Android

I'm trying to get an onClickListener to fire on a Spinner, but I get the following error:

Java.lang.RuntimeException is "Don't call setOnClickListener for an AdapterView. You probably want setOnItemClickListener instead,"

I'm sure I want to call onClickListener and NOT onItemClickListener. I found a question asked by someone else on Stack Overflow, Is there a way to use setOnClickListener with an Android Spinner?

The answer stated there is:

You will have to set the Click listener on the underlying view (normally a TextView with id: android.R.id.text1) of the spinner. To do so:

Create a custom Spinner In the constructor (with attributes) create the spinner by supplying the layout android.R.layout.simple_spinner_item Do a findViewById(android.R.id.text1) to get the TextView Now set the onClickListener to the TextView

I have tried the answer noted there, but it doesn't seem to work. I get a null pointer to the TextView after I do the findViewById().

This is what I'm doing:

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         }     }); } 

File layoutspinner.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"/> 

What am I doing wrong?

I'm new to Stack Overflow, I didn't find any way to post an aditional question to the other thread (or comment since I have to little rep) so I started a new question.

Per recomendation I tried this:

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             }         });     } } 

But LogCat isn't showing promising results.

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

I have tested this on API levels 7 and 8 with the same results.

like image 567
blindstuff Avatar asked Oct 13 '10 21:10

blindstuff


People also ask

Does Android have OnClickListener?

In Android, the OnClickListener() interface has an onClick(View v) method that is called when the view (component) is clicked. The code for a component's functionality is written inside this method, and the listener is set using the setOnClickListener() method.

How can we check whether a spinner is open or not in android?

We can user onClickListner for spinner. Since spinner open when we click(tap) on it. And to chcek where the spinner is open or not we can use onItemSelectedListner callbacks. Tell me if you want further code example.


2 Answers

Here is a working solution:

Instead of setting the spinner's OnClickListener, we are setting OnTouchListener and OnKeyListener.

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

and the listeners:

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;         }     } }; 
like image 53
OferR Avatar answered Sep 24 '22 06:09

OferR


Whenever you have to perform some action on the click of the Spinner in Android, use the following method.

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

One thing to keep in mind is always to return False while using the above method. If you will return True then the dropdown items of the spinner will not be displayed on clicking the Spinner.

like image 22
Gaurav Arora Avatar answered Sep 23 '22 06:09

Gaurav Arora