Java 如何更改按钮的onClick()行为?

Java 如何更改按钮的onClick()行为?,java,android,Java,Android,我真的不知道这个问题该问到哪里去,因为我不一定知道这有多可能。我对Android Studio和总体编码还是有点陌生,但我知道这很危险(也许这是我的问题——对于初学者来说,我的想法可能过于浮夸),但这正是我想要做的 我有一个带有几个按钮的单页应用程序。我正在创建一个应用程序,它本质上是一个NFL游戏的计分器,我选择的计分方法如下所示: 上述部分为水平线性布局,每侧4个计分按钮有2个嵌套线性布局。垂直切换按钮已设置为将底部按钮上的文本从Fieldgoal更改为Safety,反之亦然,具体取决于每

我真的不知道这个问题该问到哪里去,因为我不一定知道这有多可能。我对Android Studio和总体编码还是有点陌生,但我知道这很危险(也许这是我的问题——对于初学者来说,我的想法可能过于浮夸),但这正是我想要做的

我有一个带有几个按钮的单页应用程序。我正在创建一个应用程序,它本质上是一个NFL游戏的计分器,我选择的计分方法如下所示:

上述部分为水平线性布局,每侧4个计分按钮有2个嵌套线性布局。垂直切换按钮已设置为将底部按钮上的文本从Fieldgoal更改为Safety,反之亦然,具体取决于每侧切换的正确/错误

teamOneToggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
            if (isChecked) {
                teamTwoToggleButton.setChecked(false);
                teamOneSafety.setText("SAFETY");
                teamTwoSafety.setText("FIELDGOAL");
            } else {
                teamTwoToggleButton.setChecked(true);
                teamTwoSafety.setText("SAFETY");
                teamOneSafety.setText("FIELDGOAL");
            }            }        });
我已经计算出了这一部分,但是由于安全性得分为2分,fieldgoal得分为3分,我需要能够改变onClick行为

我希望有一个Java函数可以让我设置一个新的onClick活动,就像我可以设置text、setColor、setAlignment、set(无论什么)一样,但我找不到任何接近的东西

我还尝试过根据按钮本身的.getText()定义字符串,但我的应用程序每次都会崩溃


如果有人有任何想法,我的完整代码就在我的网页上。

如果我理解您的问题,您想更改OnClick Listener

当前,您可以在XML中定义它:

android:onClick="touchdownClickTeamOne" //This is not recommended practice, now you know.
您应该在Java代码中执行此操作:

Button teamOneTouchDown = findViewById(R.id.team_one_off_td);
teamOneTouchDown.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        // Do stuff
    }
});
现在您知道如何重新定义任何按钮的onclick侦听器


如果按钮显示“安全”,我不知道如何设置它,以编程方式执行“此”,如果按钮显示“Fieldgoal”,则执行“此”

当前您使用的方法是:

public void fieldgoalClickTeamOne (View v) {
    scoreTeamOne = scoreTeamOne + 3;
    displayForTeamOne(scoreTeamOne);
}
我们知道View
v
是一个按钮,这就是按钮是文本视图,所以让我们检查文本:

public void fieldgoalClickTeamOne (View v) {
    TextView textView = (TextView) v; // Could cast to Button, makes no difference here
    if (textView.getText().toString().equals("SAFETY") {
        // Do this
    } else {
        // Do that
    }
}

PS我很高兴看到初学者遵循编码惯例,您的代码非常容易阅读。我有几点建议

首先,您应该花点时间了解
if
else if
else
之间的区别。您的AdapterView应该只有on
if
语句和许多
else if
s语句

其次,您应该花一些时间学习通用编码实践和/或可重用性(这个概念有点棘手)。回到AdapterViews,您只需要一个OnItemSelectedListener:

OnItemSelectedListener onItemSelectedListener = new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
        final ImageView imageView;
        if (adapterView.getId() == R.id.teamOneSpinner) 
            imageView = (ImageView) findViewById(R.id.team_one_spinner_team_logo);
        else
            imageView = (ImageView) findViewById(R.id.team_two_spinner_team_logo);

        String s=((TextView)view).getText().toString();
        if(s.equals("Arizona Cardinals"))
            imageView.setImageResource(R.drawable.arizona_cardinals);
        else if(s.equals("Atlanta Falcons"))
            imageView.setImageResource(R.drawable.atlanta_falcons));
        else if(s.equals("Baltimore Ravens")) 
            //etc, etc

看看我帮你省了多少钱!您的许多方法都是重复的,您可以使用这些技术删除80%的代码。

是的,基本上我认为我需要使用onClickListener,但我不确定如何设置它,以编程方式在按钮显示“安全”时执行“此”,在按钮显示“Fieldgoal”时执行“此”。特别是因为我计算分数的方法发生在主onCreate之外。啊,好吧,我先发制人了一点,但我以旋转器为例。我会在你的评论中添加一个例子。我添加了另一个广告,希望对你有所帮助!如果是的话,请投票表决并接受它作为解决方案。这很有意义!谢谢你的全面反馈,我真的很感激-我希望我的代码总体上变得更高效。Sam,我开始浏览你上面发布的内容,这很有意义,但是在我开始将你的PS引入我的.java文件以更新AdapterView之后,就像你建议的那样,我在这里得到一个错误:
final-ImageView
if(parent.getId()==R.id.teamOneSpinner)
它告诉我:无法解析符号“parent”--我做错了什么?
teamOneSpinner.setOnItemSelectedListener(onItemSelectedListener);
teamTwoSpinner.setOnItemSelectedListener(onItemSelectedListener);