如何解决如何将 Spinner 用作 ACTION 而不是 SELECTION?
是否有可能将微调器用作动作功能而不是选择? 当用户点击 Spinner 视图时会弹出一些项目,目前 Spinner 允许我们选择项目,这意味着当用户点击第一个项目时,onItemSelected 回调将被启动,下次点击同一个项目时不会发生任何事情( ) 甚至不调用 OnNothingSelected。如何修改它以使其成为操作(例如打印 hello world),即使用户连续多次单击同一项目。 在没有用户交互的情况下调用 onItemSelected 时还有另一个问题。 我尝试添加一些布尔值来控制用户是否单击或在启动时调用它,但不起作用,因为在选择相同项目时未选择项目。换句话说,我想添加 onItemClick listetner,当我添加时它会崩溃。也许我应该用别的东西?
解决方法
如官方文档所述:
微调器不支持项目点击事件。调用这个方法会 引发异常。
但是我找到了这个解决方案,它可以在下面的链接中知道微调器是打开还是关闭。我修改它以在 Spinner 关闭时获取 ItemSelected https://stackoverflow.com/a/18636385/7085389
您需要像下面的代码一样创建一个自定义 Spinner
import android.content.Context;
import android.util.AttributeSet;
public class CustomSpinner extends androidx.appcompat.widget.AppCompatSpinner {
// implement the Spinner constructors that you need
public CustomSpinner(Context context) {
super(context);
}
public CustomSpinner(Context context,AttributeSet attrs) {
super(context,attrs);
}
private OnSpinnerItemSelected mListener;
private boolean mOpenInitiated = false;
@Override
public boolean performClick() {
// register that the Spinner was opened so we have a status
// indicator for when the container holding this Spinner may lose focus
mOpenInitiated = true;
return super.performClick();
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
if (hasBeenOpened() && hasFocus) {
performClosedEvent();
}
}
/**
* Register the listener which will listen for events.
*/
public void setOnSpinnerItemSelected(
OnSpinnerItemSelected onSpinnerItemSelected) {
mListener = onSpinnerItemSelected;
}
/**
* Propagate the closed Spinner event to the listener from outside if needed.
*/
public void performClosedEvent() {
mOpenInitiated = false;
if (mListener != null) {
mListener.onSelect(this.getSelectedItem());
}
}
/**
* A boolean flag indicating that the Spinner triggered an open event.
*
* @return true for opened Spinner
*/
public boolean hasBeenOpened() {
return mOpenInitiated;
}
/**
* An interface which a client of this Spinner could use to receive
* open/closed events for this Spinner.
*/
public interface OnSpinnerItemSelected {
/**
* Callback triggered when the spinner was closed.
*/
void onSelect(Object item);
}
}
你可以像下面的代码一样使用它:
spinner.setOnSpinnerItemSelected(new CustomSpinner.OnSpinnerItemSelected() {
@Override
public void onSelect(Object item) {
Log.d(TAG,"onSelect: "+item);
}
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。