【问题标题】:how to stop a spinner from automatically selecting an option?如何阻止微调器自动选择选项?
【发布时间】:2025-11-29 10:45:01
【问题描述】:

我正在做的应用程序中有一个微调器,当它转到 OnItemSelected 时,它会自动选择第一个选项,我该如何以简单的方式停止它?

 spinner2.setOnItemSelectedListener(new OnItemSelectedListener(){


                        @Override
                        public void onItemSelected(AdapterView<?> parent,
                                View view,
                                int pos, long id) {

【问题讨论】:

  • 这是默认行为。你还期待什么???
  • 这对你很有用,我之前也有同样的问题:*.com/questions/10167162/…
  • 最好使用弹出菜单而不是微调器。

标签: android spinner


【解决方案1】:

这个问题在 SO 和其他地方已经被问过很多次了。例如:

onNavigationItemSelected in ActionBar is being called at startup how can avoid it?

Infinite loop when using onNavigationItemSelected and invalidateOptionsMenu

Activity loop using onNavigationItemSelected on an ActionBar

几个答案和 cmets 建议忽略(某些)回调。这适用于非常简单的用途,但它忽略了这样一个事实,即大多数问这个问题的人想要一个 menu 而不是标准 ActionBar 在列表模式下提供的基于微调器的选项卡式导航。一些 cmets 建议使用 PopupMenu,但我没有看到提供详细信息。所以这里是做什么:

  1. 创建将显示在 ActionBar 中并且用户将在其上单击以查看菜单的 View:

    View view = this.getLayoutInflater().inflate(R.layout.actionbar_view, null);
    
  2. 创建一个锚定到该视图的 PopupMenu:

    PopupMenu popup = new PopupMenu(this, view);
    popup.getMenuInflater().inflate(R.menu.actionbar_menu, popup.getMenu());
    
  3. 在显示 PopupMenu 的视图中添加 OnClickListener

    view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            popup.show();
        }
    });
    
  4. OnMenuItemClickListener 添加到 PopupMenu 以在用户从菜单中选择时接收通知:

    popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            Toast.makeText(MainActivity.this, item.getTitle(), Toast.LENGTH_SHORT).show();
            return true;
        }
    });
    
  5. 最后,在你的Activity中使用如下配置ActionBar:

    ActionBar ab = this.getActionBar();
    ab.setCustomView(view);
    ab.setDisplayShowCustomEnabled(true);
    ab.setDisplayShowTitleEnabled(false);
    

有一个评论是,让主视图的样式与默认的 ActionBar 匹配可能有点棘手。尝试调查以下样式资源:

@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title
@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title.Inverse
@android:style/TextAppearance.Holo.Widget.ActionBar.Title
@android:style/TextAppearance.Holo.Widget.ActionBar.Title.Inverse

否则,您至少需要正确的颜色和可能中等的文本大小。视图本身显然应该fill_parent 并具有center_vertical 重力。

'纳夫说。

【讨论】:

    【解决方案2】:

    您可以使用布尔变量来检查是否是第一次,不要执行代码。 第二次执行你的代码,否则是默认行为。

    【讨论】:

    • 喜欢这个 onItemSelected(){ if(firstTime){ firstTime = false;返回真;}}
    【解决方案3】:

    如何以简单的方式阻止它?

    你没有。 Spinner always 有一个选择,除非适配器为空且无法选择。您的应用需要始终以一种或另一种方式处理选择。

    【讨论】:

      【解决方案4】:

      只需添加if 语句即可检查项目的位置。在选择位置0以外的其他项目时,在位置0处添加提示,然后执行您的功能,如下所示:

      spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
          @Override
          public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
          {
              if (position != 0)
              {
                  String val = spinner.getSelectedItem().toString();
                  // Toast.makeText(activity, formid, Toast.LENGTH_SHORT).show();
              }
          }
      
          @Override
          public void onNothingSelected(AdapterView<?> parent) {
      
          }
      });
      

      【讨论】: