有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我真的不确定这个问题该怎么回答,因为我不知道这有多可能。我对Android Studio和总体编程还是有点陌生,但我知道这很危险(也许这是我的问题——对于初学者来说,我的想法可能太浮夸了),但这正是我想要做的

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

screenshot

上面的部分是一个水平线性布局,每侧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分,野战目标得分为3分,我需要能够改变onClick行为

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

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

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


共 (1) 个答案

  1. # 1 楼答案

    如果我理解你的问题,你想换一个听众

    目前,您可以在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侦听器了


    I'm not sure how to set it up in a way to programmatically do "this" if the button displays 'Safety' and do "that" if the button displays 'Fieldgoal'.

    目前您使用的方法是:

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

    我们知道视图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我很高兴看到初学者遵循编码惯例,你的代码非常容易阅读。我有几点建议

    首先,你应该花点时间来了解ifelse ifelse之间的区别。AdapterView应该只有onif语句和许多else if

    其次,您应该花一些时间学习通用编码实践和/或可重用性(这个概念有点棘手)。回到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%的代码