2

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

 spinner2.setOnItemSelectedListener(new OnItemSelectedListener(){


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

4 回答 4

2

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

ActionBar中的onNavigationItemSelected在启动时被调用如何避免它?

使用 onNavigationItemSelected 和 invalidateOptionsMenu 时的无限循环

在 ActionBar 上使用 onNavigationItemSelected 的活动循环

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

  1. 创建将在 ActionBar 中显示的视图,用户将在其上单击以查看菜单:

    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. OnClickListener在显示 PopupMenu 的视图中添加一个:

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

    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重力。

'纳夫说。

于 2013-07-25T16:28:23.473 回答
1

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

于 2013-05-15T11:25:21.120 回答
0

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

你没有。ASpinner 总是有一个选择,除非适配器是空的并且没有选择是可能的。您的应用程序需要始终以一种或另一种方式处理选择。

于 2013-05-15T11:13:12.443 回答
0

只需添加一个if语句来检查项目的位置。在选择位置0以外的项目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) {

    }
});
于 2021-12-14T09:24:38.513 回答