我处理的问题是我需要能够将特定参数传递给按钮的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
}
}
编辑:由于问题似乎不清楚,我已在我的工作解决方案中进行了编辑。现在的问题是找到一种我们不需要将上下文存储为实例变量的方法。
答案 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;
}
}
}