我有这个代码

spinner.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                if (parent.getItemAtPosition(position).equals("Choose an article")){
                }else {
                    String item = parent.getItemAtPosition(position).toString();
                    Toast.makeText(parent.getContext(),"long click: " +item, Toast.LENGTH_SHORT).show();
                }
                return false;
            }
        });

当我调试代码时,长点击项事件什么也不做.OnItemLongClick()中的代码永远不会执行.我怎么才能修好它呢?

推荐答案

Android中的Spinner可能不支持setOnItemLongClickListener,因为它的用户界面性质--它本质上是一个对话框或下拉菜单.短点击后下拉菜单将关闭,因此长点击监听程序不适用于此,因此您的长点击监听程序不被触发.

If you want to add additional interaction to the spinner, you could use the normal setOnItemSelectedListener instead.
(Examples here, and "Android - Text is Pushed to the Left in a Spinner")
You would then have to implement your own time logic if you want to simulate a long click event.

但是,由于onTouch方法不是OnItemSelectedListener接口的一部分,我们将需要一种不同的方法来模拟Spinner上的长按压.正如前面提到的,它本身并不支持长点击:一种方法是创建一个定制的Spinner类,您可以在其中自己管理touch 事件.一个非常基本的实施是:

public class LongClickSpinner extends androidx.appcompat.widget.AppCompatSpinner {

    private static final long LONG_PRESS_TIME = 500; // Time in milliseconds
    private long pressStartTime;

    public LongClickSpinner(Context context) {
        super(context);
    }

    public LongClickSpinner(Context context, int mode) {
        super(context, mode);
    }

    public LongClickSpinner(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                pressStartTime = System.currentTimeMillis();
                break;
            case MotionEvent.ACTION_UP:
                long pressDuration = System.currentTimeMillis() - pressStartTime;
                if (pressDuration >= LONG_PRESS_TIME) {
                    // Do your long click action here
                    Toast.makeText(getContext(), "Long click!", Toast.LENGTH_SHORT).show();
                    return true;
                }
                break;
        }
        return super.onTouchEvent(event);
    }
}

您可以像使用普通的Spinner一样在您的XML布局中使用这LongClickSpinner.当用户touch 微调按钮超过LONG_PRESS_TIME毫秒时,您的"Long Click"操作将执行.

该解决方案仍然是一种变通办法,可能不适合所有用例.Spner不是用来处理长按事件的,它使用此自定义实现的行为可能并不完美.


如果您需要不同的交互范例来 Select 项,则可能需要考虑使用其他支持长点击的UI组件,例如ListViewRecyclerView.

对于ListViewRecyclerView,您可以拥有既支持普通点击(用于 Select 项目)又支持长点击(例如用于显示其他选项)的项目列表.然后,长点击实现将如下所示:

listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
        String item = parent.getItemAtPosition(position).toString();
        Toast.makeText(parent.getContext(), "long click: " + item, Toast.LENGTH_SHORT).show();
        return true;  // Return true to show that the event has been consumed.
    }
});

使用ListViewRecyclerView与使用Spinner的不同之处在于,ListView/RecyclerView在您的布局中始终可见,而Spinner只有在点击后才会显示其项目.

如果您希望在具有setOnItemLongClickListener功能的同时具有类似微调控件的行为,一种 Select 是创建一个包含ListViewRecyclerView的自定义对话框.这样,您就可以利用长点击监听器支持的好处来模拟微调器行为.

Android相关问答推荐

Android编写动画在发布版本中崩溃

滑动以更改合成中的活动

list 合并失败,AGP 8.3.0

如何处理谷歌未经证实的应用程序拒绝?

Jetpack Compose和Android Studio中的普通设计工具有什么不同?

使用Kotlin/Compose与Java/XML指南的比较

try 用Jetpack Compose理解视图模型和导航

第一次使用onBackPressed()、NavigateUp()加载时MapView崩溃

安卓Azure通讯聊天UI库导入?

如何在 Jetpack Compose LazyColumn 中将项目分组在一起,例如卡片

解决失败:Landroidx/compose/runtime/PrimitiveSnapshotStateKt

为什么@PrimaryKey val id: Int? = null 在创建 Room 实体时有效吗?

如何在 Delphi 和 Android 上避免 Indy Socket Error #13 Access denied 异常?

如何在 React Native 中调试网络响应

在事件中使用 Context/Toast 时不需要的重组 - Jetpack Compose

如何将一个 Composable 作为其参数传递给另一个 Composable 并在 Jetpack Compose 中显示/运行它

在 Jetpack Compose 中使用 .observeAsState() 时,如何在更改 MutableLiveData 的值后开始执行一段代码?

根据 Jetpack Compose 中的生命周期正确处理变量/函数

在 Jetpack Compose 中更改列中子项的对齐方式

无法再查看 Jetpack Compose 预览.无法实例化一个或多个类 (ComposeViewAdapter)