【问题标题】:How to set on click listener for a custom button?如何为自定义按钮设置点击监听器?
【发布时间】:2020-08-17 02:20:17
【问题描述】:

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

我的片段带有线性布局上的自定义按钮 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
}

}

【问题讨论】:

    标签: java android onclicklistener custom-button


    【解决方案1】:

    试试这个:

    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
    }
    
    }
    

    【讨论】:

      【解决方案2】:

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

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

      如果您希望支持用户设置 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);
              }
          }
      }
      

      P.S - 我还建议您查看 Java 的命名约定。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多