java - 将参数传递给按钮

标签 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”,但后来我遇到了处理上下文的问题,因为我想产生一个新的 Intent 。

像这样的解决方案可能可行,但有一些大问题

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

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

最佳答案

将按钮移至“Activity ”级别并将其设置为私有(private),它将在内部类中可见 - 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() 。即使 View 都保存上下文,因此可以从 clickListener 访问它,并且不需要通过构造函数传递它。

关于java - 将参数传递给按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48057968/

相关文章:

java - ReSTLet 发送客户端证书

Android - Google Drive API 实现错误

android - 广播信标时出现 ADVERTISE_FAILED_INTERNAL_ERROR

android - 类固醇和 ionic css 兼容性?

java - 如何强制 java swing gui 更新此代码片段

android - PhoneGap Android条码扫描UI修改

java - MiGLayout 大小调整在 JavaFX 中无法正常工作

java - diffie hellman 加密公钥给出错误的值

java - 使用tomcat时如何将文件保存在客户端电脑而不是服务器电脑上

java - 在 Fragment 中设置代码时需要帮助(Android 开发)