【问题标题】:Android Spinner - onItemSelected / setOnItemSelectedListener not triggeringAndroid Spinner - onItemSelected / setOnItemSelectedListener 未触发
【发布时间】:2011-06-22 20:08:09
【问题描述】:

这让我发疯了,因为这是我以前做过的事情,但不知道为什么它现在不起作用......

我有一个菜单按钮,通过menu.xml 文件和带有开关的onOptionsItemSelected 方法以通常的方式实现,它创建并显示一个微调器。

我添加了setOnItemSelectedListener,但它似乎永远不会触发。微调器出现,我选择一个选项或退出,onItemSelectedonNothingSelected 都没有被调用。

这里是菜单按钮处理开关语句的“case”和“return true”之间的所有代码。 (topThis 是一个引用活动上下文的变量 - 适用于应用程序中的所有其他 toast)

String[] widgetModes = {"Mode 1", "Mode2"};
ArrayAdapter<String> widgetModeAdapter = new ArrayAdapter<String> (this, android.R.layout.simple_spinner_item, widgetModes);
widgetModeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

Spinner widgetModeSpinner = new Spinner(this);
widgetModeSpinner.setAdapter(widgetModeAdapter);
widgetModeSpinner.setPrompt("Choose Widget Mode");

widgetModeSpinner.setOnItemSelectedListener(new OnItemSelectedListener() 
{
    @Override
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) 
    {
        Toast.makeText(topThis, "derp", Toast.LENGTH_LONG).show();
    }

    @Override
    public void onNothingSelected(AdapterView<?> parentView) 
    {
        Toast.makeText(topThis, "herf", Toast.LENGTH_LONG).show();
    }
});

widgetModeSpinner.performClick();

有什么想法吗?我隐约怀疑我以编程方式创建Spinner 的事实是问题所在......

【问题讨论】:

  • 也许试试 parentView.getContext() ?您不需要将它添加到 UI 的某个位置吗? - 这可能意味着 UI 交互事件(如项目选择)不会传递给 Spinner。
  • 感谢您的提示 - 最终按照这些思路实现了一些东西。在布局中添加了一个不可见的微调器,将除 performClick 之外的所有内容移出菜单方法并移入 onCreate 中调用的方法。似乎确保侦听器“附加”到当前膨胀的布局或类似的布局。代码相对于 setContentView(R.layout.main); 的位置很重要……
  • 我认为我的其余代码涉及偶尔重新膨胀布局(使用 setContentView(R.layout.main);) 的事实也会导致问题......如果之后没有再次设置,则不再附加监听器布局重新膨胀。
  • 您应该尝试使用简单的日志。 i("标签", "消息" ) ;而不是 Toast 来确认它不是你的 Context topThis 导致它吗?
  • 您正在定义一个 onItemSelectedListener 但正在调用一个合成 performClick().... 也许您应该重写 onItemClicked() 代替?

标签: android android-layout triggers spinner listener


【解决方案1】:

请记住,您不能重新选择同一个微调器项目,如果您没有添加一些自定义代码来处理微调器选择,它总是将第一个项目设置为选中。

对于未显示的 Toast,我建议在这样的侦听器界面中创建 Toast 时始终使用“MyActivity.this”作为上下文:

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        /**
         * Called when a new item is selected (in the Spinner)
         */
         public void onItemSelected(AdapterView<?> parent, View view, 
                    int pos, long id) {
                // An spinnerItem was selected. You can retrieve the selected item using
                // parent.getItemAtPosition(pos)

                Toast.makeText(MyActivity.this, "Hello Toast",Toast.LENGTH_SHORT).show();

            }

            public void onNothingSelected(AdapterView<?> parent) {
                // Do nothing, just another required interface callback
            }

    }); // (optional)

而且末尾的 .show() 有时很容易忘记;)

【讨论】:

    【解决方案2】:

    实际上,如果你的微调器可见性设置为 gone 那么当你调用 performclick() 方法时它会触发它的点击,但它不会触发它的 setOnItemSelectedListener 所以你需要改变可见性然后它才会起作用

    【讨论】:

      【解决方案3】:

      我知道这个问题有点老了,但如果您正在等待 AsyncTask 回调,请确保通过在回调线程上调用 notifyDataSetChanged() 让您的适配器知道数据更改!

      @Override
      public void onPostExecute(String result) {
         ///do something with your data  
         spinnerArrayAdapter.notifyDataSetChanged();
      }
      

      【讨论】:

      • 谢谢。为此挖了 2 个小时 :)
      【解决方案4】:

      我在实现微调器时遇到了类似的问题,我通过获取父视图并设置适配器解决了它-

      spinner1 =(Spinner)findViewById(R.id.spinner1);
      spinner1.setAdapter(BindSpinner("ProgramMaster",cols,null,true,""));
      spinner1.setOnItemSelectedListener(new OnItemSelectedListener() 
      {
      protected Adapter initializedAdapter=null;
          @Override
          public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) 
          {
              if(initializedAdapter !=parentView.getAdapter() ) {
                  initializedAdapter = parentView.getAdapter();
                 return;
              }
      
              String selected = parentView.getItemAtPosition(position).toString();
      
              if(abc.equals("Select") && !selected.equals("Select"))
              {
                  do something
              }
      
              else 
              {
                  Do something
              }
              textQualification=selected;
              SearchUpdated("Qualification");
          }
      
          @Override
          public void onNothingSelected(AdapterView<?> parentView) {
              // your code here
          }
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-04
        • 1970-01-01
        相关资源
        最近更新 更多