在Android中设置一个微调onClickListener()

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

Java.lang.RuntimeException是“不要调用一个AdapterView的setOnClickListener,你可能想要setOnItemClickListener”

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

答案是:

您必须在微调器的基础视图(通常是带有id:android.R.id.text1的TextView)上设置Click监听器。 要做到这一点:

创build一个自定义的微调框在构造函数(带属性)通过提供布局android.R.layout.simple_spinner_item来创build微调框一个findViewById(android.R.id.text1)来获取TextView现在将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 } }); } 

文件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"/> 

我究竟做错了什么?

我是Stack Overflow的新手,我没有find任何方法来向另一个线程发布一个附加问题(或者因为我有一个小代表),所以我开始了一个新的问题。

每recomendation我试过这个:

 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上testing了这个结果。

Solutions Collecting From Web of "在Android中设置一个微调onClickListener()"

下面的工作如何你想要的,但它不是理想的。

 public class Tester extends Activity { String[] vals = { "here", "are", "some", "values" }; Spinner spinner; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); spinner = (Spinner) findViewById(R.id.spin); ArrayAdapter<String> ad = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, vals); spinner.setAdapter(ad); Log.i("", "" + spinner.getChildCount()); Timer t = new Timer(); t.schedule(new TimerTask() { @Override public void run() { int a = spinner.getCount(); int b = spinner.getChildCount(); System.out.println("Count =" + a); System.out.println("ChildCount =" + b); for (int i = 0; i < b; i++) { View v = spinner.getChildAt(i); if (v == null) { System.out.println("View not found"); } else { v.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.i("","click"); } }); } } } }, 500); } } 

让我确切地知道你需要这个微调的行为,我们可以find一个更好的解决scheme。

这是一个可行的解决scheme:

不是设置微调器的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; } } }; 

无论何时您必须在Android中单击微调器时执行一些操作,请使用以下方法。

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

有一点要记住,在使用上面的方法时总是返回False 如果您将返回True,那么单击Spinner时将不显示微调器的下拉菜单项。

我个人使用的是:

  final Spinner spinner = (Spinner) (view.findViewById(R.id.userList)); spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { userSelectedIndex = position; } @Override public void onNothingSelected(AdapterView<?> parent) { } }); 

首先,微调不支持项目点击事件。 调用这个方法会引发一个exception。

你可以使用setOnItemSelectedListener:

 Spinner s1; s1 = (Spinner)findViewById(R.id.s1); int selectionCurrent = s1.getSelectedItemPosition(); spinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) { if (selectionCurrent != position){ // Your code here } selectionCurrent= position; } } @Override public void onNothingSelected(AdapterView<?> parentView) { // Your code here } }); 

我build议Spinner的所有事件分为两类:

  1. 用户事件(你的意思是“点击”事件)。

  2. 节目活动。

我还build议,当你想抓住用户事件,你只是想摆脱“节目活动”。 所以这很简单:

 private void setSelectionWithoutDispatch(Spinner spinner, int position) { AdapterView.OnItemSelectedListener onItemSelectedListener = spinner.getOnItemSelectedListener(); spinner.setOnItemSelectedListener(null); spinner.setSelection(position, false); spinner.setOnItemSelectedListener(onItemSelectedListener); } 

有一个关键时刻:你需要setSelection(position,false)。 animation参数中的“false”将立即触发事件。 默认行为是将事件推送到事件队列。