将参数传递给按钮

时间:2018-01-02 08:47:15

标签: java android user-interface

我处理的问题是我需要能够将特定参数传递给按钮的onClick方法。我想做的是这样的事情:

public class MainActivity extends AppCompatActivity {

    private static int clicked = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final ImageButton btn = findViewById(R.id.imageButton2);
        btn.setOnClickListener(new WhenClicked(btn, getApplicationContext()));
    }

    public static void incrementClicked()
    {
        clicked += 1;
    }
}

我知道实现这项工作的一种方法是拥有我们自己的" OnClickListener",然后我遇到了处理context的问题,因为我想产生一个新的意图。

像这样的解决方案可以起作用,但有一些大问题

public class WhenClicked implements View.OnClickListener {

    private Context context; //this is obviously bad
    private ImageButton imgbtn;


    public WhenClicked(ImageButton imgbutton, Context context)
    {
        this.context = context;
        this.imgbtn = imgbutton;
    }

    @Override
    public void onClick(View view) {
        imgbtn.setColorFilter(Color.argb(150, 255, 255, 255));
        MainActivity.incrementClicked();
        //now to spawn an activity
    }
}

编辑:由于问题似乎不清楚,我已在我的工作解决方案中进行了编辑。现在的问题是找到一种我们不需要将上下文存储为实例变量的方法。

2 个答案:

答案 0 :(得分:2)

在活动级别移动按钮并将其设为私有,它将在内部类中显示 - OnClickListener 。关于上下文,您可以在 onClick 内访问它,例如MainActivity.this

public class MainActivity extends AppCompatActivity {

    private int clicked = 0;

    private ImageButton btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn = findViewById(R.id.imageButton2); 
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                btn.setColorFilter(Color.argb(150, 255, 255, 255));//sets a tint

                // PART YOU ARE INTERESTED IN
                clicked++;
                Intent intent = new Intent(MainActivity.this, Someclass.class);
            }
        });
    }
}

如果你需要这个作为自定义监听器类,你可以这样做:

public class CustomOnClickListener implements OnClickListener {
    int clicked = 0 ;

    @Override
    public void onClick(View v) {
        // here comes View, not ImageButton, so you should check if it is ImageButton and then set tint
        if (v instanceof ImageButton) {
            ((ImageButton)v).setColorFilter(Color.argb(150, 255, 255, 255));
        }

        // PART YOU ARE INTERESTED IN
        clicked++;
        Intent intent = new Intent(v.getContext(), Someclass.class);
    }
}

如您所见,您有上下文 - v.getContext()。 Eveny View 保存上下文,因此可以从clickListener访问它,您无需通过构造函数传递它。

答案 1 :(得分:1)

实际上没有必要做任何静态的事情或将上下文传递给另一个类。一种简单的方法是使您的Activity实现OnClickListener 。将当前的Activity实例设置为click侦听器,并在onClick()方法中获取回调,该方法将View作为参数。您可以通过查看视图ID轻松获取图像按钮的点击。当您必须处理布局中多个视图的点击时,这也是最好的方法。

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private int clicked = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final ImageButton btn = findViewById(R.id.imageButton2);
        //set click listener
        btn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.imageButton2:
                 //Imagebutton is clicked
                 i++;
                 break;
        }
    }
}