【问题标题】:android onclicklistener on class with button inside?android onclicklistener 类里面有按钮?
【发布时间】:2016-06-01 11:18:12
【问题描述】:

我制作了一个动态创建 3 个按钮的应用。由于某些原因,我需要从我创建的类中创建每个按钮。

在这个类中我写了这个:

public class FloatButton{
    public void generate(String text, final Context context){


        Button button = new Button(context);
        button.setText(text);
}

现在在我的主要活动中,我创建了一个此类的对象:

FloatButton floatButton = new FloatButton();
floatButton.generate("float Button", this);

现在解决问题...我需要为每个按钮添加一个单独的 onclick 侦听器。我想通过单击按钮与类的其他按钮进行交互。这就是为什么我需要将 onclick 侦听器写入我的主要活动而不是 FloatButton 类。所以我尝试了以下方法:

floatButton.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {

     }
});

这不起作用,因为 floatButton 对象没有 setOnClickListener 方法,因为它不是按钮类的一部分。

我还尝试为类中的按钮设置一个 ID。因此这个类看起来像这样:

public class FloatButton{
    public void generate(String text, int id, final Context context){


        Button button = new Button(context);
        button.setId(id);
        button.setText(text);

    }
}

现在我希望通过按钮 id 设置 onclicklistener:

final OnClickListener listener = new View.OnClickListener() {

  @Override
  public void onClick(View v) {
    switch (v.getId()){
      case R.id.1:
        ...
        break;
      case R.id.2:
        ...
        break;
  }
}

可悲的是 R.id。 ... 也不起作用,因为 Id 仅在按钮已创建时可用。

那么我还能尝试做什么?

【问题讨论】:

  • 你必须在你的按钮类中使用接口技术来更有效地交互

标签: android class button onclick


【解决方案1】:

你可以像下面这样实现:

public class FloatButton{
    private ClickListener listener;

    public void generate(String text, final Context context){
        Button button = new Button(context);
        button.setText(text);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(listener != null){
                    listener.onClick(v);
                }
            }
        });
    }
    public void setListener(ClickListener listener){
        this.listener = listener;
    }

    public interface ClickListener {
        void onClick(View view);
    }
}

活动类

FloatButton floatButton = new FloatButton();
floatButton.generate("float Button", this);
floatButton.setOnClickListener(new FloatButton.ClickListener() {
    @Override
    public void onClick(View v) {
        // You will receive all the generated button click events here in                 
        // single callback.
        // Do whatever you want to do here...
    }
});

【讨论】:

    【解决方案2】:

    你可以给按钮添加一个getter

    public class FloatButton{
    
         private Button button;
    
         public void generate(String text, final Context context){
             button = new Button(context);
             button.setText(text);
         }
    
         public getButton(){
             return button;
         }
    
    }
    

    所以在实例化你的 floatButton 对象后,你可以使用你的 getter 设置 onClickListener

    floatButton.getButton().setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
    
         }
    });
    

    【讨论】:

      【解决方案3】:

      将生成函数更改为

      public Button generate(String text, final Context context){
              Button button = new Button(context);
              button.setText(text);
              return button;
      } 
      

      然后在活动中返回的对象上设置监听器

      Button generated =  floatButton.generate("float Button", this);
      generated.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
      
           }
      });
      

      【讨论】:

      • 太棒了!我没有考虑返回按钮。我会在一分钟内尝试一下
      【解决方案4】:

      像这样从 Button 类扩展你的按钮类 FloatButton

      public class FloatButton extends Button {
      public FloatButton(Context context) {
          super(context);
      }
      
      public FloatButton(Context context, AttributeSet attrs) {
          super(context, attrs);
      }
      
      public FloatButton(Context context, AttributeSet attrs, int defStyleAttr) {
          super(context, attrs, defStyleAttr);
      }
      
      public void generate(String text, final Context context) {
          FloatButton button = new FloatButton(context);
          button.setText(text);
      }
      
      //Rest of your methods
      } 
      

      您将能够设置 onClickListener 或您通常使用常规按钮执行的任何操作

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-12
        • 1970-01-01
        • 2011-03-20
        • 1970-01-01
        • 1970-01-01
        • 2022-11-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多