-1

我试图为我的自定义按钮类设置我的监听器。但是,我的听众似乎没有映射到视图。任何想法将我的按钮视图和我的自定义按钮结合起来?

我在线性布局 XML 上有一个带有自定义按钮的片段

<LinearLayout>
 ...
<Button>
...
</Button>

<LinearLayout>

我试图在 onActivityCreated 方法的片段中为按钮设置一个点击监听器。

public class myFragment extend Fragment {

@Override
public void onActivityCreated (){

Button myNewButton = new myButton();
myNewButton = root.findViewByID.(R.id.button);
myNewButton.setOnClickListener(new myButton());

}

}

我的带有 setonclicklistener 方法的自定义按钮类

public class myButton extend button implements View.onClicklistener {

@Override
public void setOnClickListener (OnClickListener listener){
super.setonClickListener(listener);
}

@Override
public void onClick(View view) {
//action to do after on click
}

}
4

2 回答 2

0

尝试这个:

删除此行myFragment

myNewButton.setOnClickListener(new myButton());

这样做myButton

public class myButton extend button implements View.onClicklistener {

@Override
public void setOnClickListener (OnClickListener listener){
//set like this
super.setonClickListener(this);
}

@Override
public void onClick(View view) {
//action to do after on click
}

}
于 2020-05-02T16:32:24.203 回答
0

您似乎将另一个按钮设置为原始按钮的侦听器,具体取决于您希望在侦听器中执行的操作,这可能会产生意外行为。

更简单的解决方案是将自己设置为侦听器,虽然您已经在 中实现,但View.onClicklistenerMyButton还没有将其设置为自己的侦听器。您需要在构造函数中这样做。

如果您希望与侦听器一起支持用户设置 onClickListeners MyButton,那么您需要在您的MyButton类中维护一个侦听器变量,然后您可以显式调用该变量。

最后,MyButton直接在你的布局中使用你的,而不是Button像你目前正在做的那样使用。

你的最后一MyButton堂课应该是以下几行,

public class MyButton extends androidx.appcompat.widget.AppCompatButton implements View.OnClickListener {

    public MyButton(Context context) {
        super(context);
        init();
    }

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

    public MyButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        setOnClickListener(this);
    }

    private View.OnClickListener mUserOnClickListener;

    @Override
    public void setOnClickListener(@Nullable OnClickListener l) {
        if (l == this) {
            super.setOnClickListener(l);
        } else {
            mUserOnClickListener = l;
        }
    }

    @Override
    public void onClick(View v) {
        //Your actions
        Toast.makeText(getContext(), "MyButton clicked", Toast.LENGTH_SHORT).show();
        if (mUserOnClickListener != null) {
            mUserOnClickListener.onClick(v);
        }
    }
}

PS - 我还建议您通过 Java 的命名约定。

于 2020-05-02T16:35:12.967 回答