Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我的自定义微调器被禁用/无响应?_Java_Android_Android Spinner_Android Custom View - Fatal编程技术网

Java 为什么我的自定义微调器被禁用/无响应?

Java 为什么我的自定义微调器被禁用/无响应?,java,android,android-spinner,android-custom-view,Java,Android,Android Spinner,Android Custom View,我创建了一个自定义微调器,因为我一次又一次地发现,我希望确保在设置微调器的初始选择或设置新的自定义适配器时,不会触发onItemSelectedListener。我只希望在用户实际选择项目时触发它 但由于某种原因(我完全不知道为什么),我的自定义微调器对触摸事件没有响应。这就好像它被禁用了一样,尽管我已经调试并看到它完全被启用了。但由于某种原因,我的小纺纱机打不开。有人能帮我理解为什么吗 以下是xml: <LinearLayout android:layout_width=

我创建了一个自定义微调器,因为我一次又一次地发现,我希望确保在设置微调器的初始选择或设置新的自定义适配器时,不会触发
onItemSelectedListener
。我只希望在用户实际选择项目时触发它

但由于某种原因(我完全不知道为什么),我的自定义微调器对触摸事件没有响应。这就好像它被禁用了一样,尽管我已经调试并看到它完全被启用了。但由于某种原因,我的小纺纱机打不开。有人能帮我理解为什么吗

以下是xml:

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:layout_marginTop="@dimen/default_margin"
        android:orientation="horizontal">
    <my.app.custom.view.MySpinner
        android:id="@+id/dog_or_cat_toggle"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:layout_margin="0dp"
        android:textAlignment="center"
        android:gravity="center_vertical|center"
        android:padding="0dp"
        android:entries="@array/dog_or_cat"
        android:spinnerMode="dropdown"
        android:background="@drawable/top_to_bottom_gray_gradient"/>
    ...
</LinearLayout>

...
和我的自定义微调器:

/* A Spinner dispatches an onItemSelected event when the View is initialized, before the user ever makes a selection.
 * This class allows listeners for just the initial selection, just user selections, or both. */
public class MySpinner extends Spinner {
    private boolean initialized = false;
    private OnItemSelectedListener onItemSelectionInitializedListener;
    private OnItemSelectedListener onItemSelectedByUserListener;
    private OnItemSelectedListener onItemSelectedListener;

    public MySpinner(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public MySpinner(Context context, AttributeSet attrs, int defStyleAttr) {
        this(context, attrs, defStyleAttr, 0);
    }

    public MySpinner(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        this.initializeMySpinner();
    }

    public void setOnItemSelectionInitializedListener(OnItemSelectedListener onItemSelectionInitializedListener) {
        this.onItemSelectionInitializedListener = onItemSelectionInitializedListener;
    }

    public void setOnItemSelectedByUserListener(OnItemSelectedListener onItemSelectedByUserListener) {
        this.onItemSelectedByUserListener = onItemSelectedByUserListener;
    }

    @Override
    public void setOnItemSelectedListener(OnItemSelectedListener onItemSelectedListener) {
        this.onItemSelectedListener = onItemSelectedListener;
    }

    @Override
    public void setAdapter(SpinnerAdapter adapter) {
        this.initialized = false;
        super.setAdapter(adapter);
    }

    private void initializeMySpinner() {
        super.setOnItemSelectedListener(new OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                if(!initialized) {
                    if(onItemSelectionInitializedListener != null) onItemSelectionInitializedListener.onItemSelected(parent, view, position, id);
                    if(onItemSelectedListener != null) onItemSelectedListener.onItemSelected(parent, view, position, id);
                    initialized = true;
                } else {
                    if(onItemSelectedListener != null) onItemSelectedListener.onItemSelected(parent, view, position, id);
                    if(onItemSelectedByUserListener != null) onItemSelectedByUserListener.onItemSelected(parent, view, position, id);
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
                if(!initialized) {
                    if(onItemSelectionInitializedListener != null) onItemSelectionInitializedListener.onNothingSelected(parent);
                    if(onItemSelectedListener != null) onItemSelectedListener.onNothingSelected(parent);
                    initialized = true;
                } else {
                    if(onItemSelectedListener != null) onItemSelectedListener.onNothingSelected(parent);
                    if(onItemSelectedByUserListener != null) onItemSelectedByUserListener.onNothingSelected(parent);
                }
            }
        });
    }
}
/*在用户进行选择之前,当视图初始化时,微调器会发送一个onItemSelected事件。
*此类仅允许侦听器进行初始选择、用户选择或两者*/
公共类MySpinner扩展微调器{
私有布尔初始化=false;
私有OnItemSelectedListener onItemSelectionInitializedListener;
私有OnItemSelectedListener onItemSelectedByUserListener;
专用OnItemSelectedListener OnItemSelectedListener;
公共MySpinner(上下文、属性集属性){
这(上下文,属性,0);
}
公共MySpinner(上下文上下文、属性集属性、int defStyleAttr){
这(context,attrs,defStyleAttr,0);
}
公共MySpinner(上下文上下文、属性集attrs、int-defStyleAttr、int-defStyleRes){
super(context、attrs、defStyleAttr、defStyleRes);
this.initializeMySpinner();
}
public void setOnItemSelectionInitializedListener(OnItemSelectedListener onItemSelectionInitializedListener){
this.onItemSelectionInitializedListener=onItemSelectionInitializedListener;
}
public void setOnItemSelectedByUserListener(OnItemSelectedListener onItemSelectedByUserListener){
this.onItemSelectedByUserListener=onItemSelectedByUserListener;
}
@凌驾
公共无效setOnItemSelectedListener(OnItemSelectedListener OnItemSelectedListener){
this.onItemSelectedListener=onItemSelectedListener;
}
@凌驾
公用void setAdapter(SpinnerAdapter适配器){
this.initialized=false;
super.setAdapter(适配器);
}
private void initializeMySpinner(){
super.setOnItemSelectedListener(新的OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView父视图、视图视图、整型位置、长id){
如果(!已初始化){
如果(onItemSelectionInitializedListener!=null)onItemSelectionInitializedListener.onItemSelected(父项、视图、位置、id);
如果(onItemSelectedListener!=null)onItemSelectedListener.onItemSelected(父项、视图、位置、id);
初始化=真;
}否则{
如果(onItemSelectedListener!=null)onItemSelectedListener.onItemSelected(父项、视图、位置、id);
如果(onItemSelectedByUserListener!=null)onItemSelectedByUserListener.onItemSelected(父、视图、位置、id);
}
}
@凌驾
未选择公共无效(AdapterView父级){
如果(!已初始化){
如果(onItemSelectionInitializedListener!=null)onItemSelectionInitializedListener.onNothingSelected(父级);
如果(onItemSelectedListener!=null)onItemSelectedListener.onNothingSelected(父级);
初始化=真;
}否则{
如果(onItemSelectedListener!=null)onItemSelectedListener.onNothingSelected(父级);
如果(onItemSelectedByUserListener!=null)onItemSelectedByUserListener.onNothingSelected(父级);
}
}
});
}
}

不要从一个构造函数调用另一个构造函数。相反,从每个构造函数调用super()构造函数


我以前也遇到过同样的问题,这个技巧奏效了,但我不确定原因

查看您不需要任何自定义的
微调器类:查看上面的代码,但如果您确实需要它,则替换
此(上下文,attrs,0)
这个(上下文,attrs,android.R.attr.spinnerStyle)this(context,attrs,0)
这个(上下文,attrs,android.R.attr.spinnerStyle)