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

时间:2018-01-22 21:48:46

标签: java android

我真的不知道该问题该去哪,因为我不一定知道它有多可能。我对Android Studio和整体编码仍然有点新鲜,但我知道这很危险(也许这就是我的问题 - 我可能认为对于初学者来说太过夸张)但这就是我所做的事情。我希望这样做。

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

screenshot

上面的部分是一个水平线性阵列,每侧有4个评分按钮,带有2个嵌套的LinearLayout。垂直切换按钮已设置为将底部按钮上的文本从Fieldgoal更改为Safety,反之亦然,具体取决于每侧切换的True / False。

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分,而实际得分为3分,我需要能够改变onClick行为。

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

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

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

1 个答案:

答案 0 :(得分:2)

如果我理解您的问题,您想要更改OnClickListener。

目前您在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
    }
});

现在您知道如何重新定义任何按钮的OnClickListener。

  

我不确定如何以编程方式设置它"这个"如果按钮显示'安全'做"那"如果按钮显示' Fieldgoal'。

目前您使用此方法:

public void fieldgoalClickTeamOne (View v) {
    scoreTeamOne = scoreTeamOne + 3;
    displayForTeamOne(scoreTeamOne);
}

我们知道视图v是一个按钮,而按钮是TextViews,所以让我们检查文字:

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 我很高兴看到初学者遵循编码惯例,您的代码非常易于阅读。我有一些指示。

首先,您应该花点时间了解ifelse ifelse之间的区别。您的AdapterView应该只有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

Viola,多个微调器的听众。设置如下:

teamOneSpinner.setOnItemSelectedListener(onItemSelectedListener);
teamTwoSpinner.setOnItemSelectedListener(onItemSelectedListener);

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