我怎样才能回报" Java中的按钮?

时间:2016-10-14 21:55:34

标签: java android algorithm android-layout android-button

我有一个应用程序可以计算篮球比赛中的得分。 每支球队有三个按钮可以提高分数(+ 3,+ 2,罚球)。

我想创建一个按钮以便在用户单击按钮时出错。 不为每个乐谱创建三个单独的按钮(+ 3,+ 2,+ 1)。但我真的不知道如何用Java代码转换它。

类似:Score = score-lastNumberAdded。对不起我的英语不好。 这是代码:

XML          

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_weight="1"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="4dp"
        android:text="Team A"
        android:textSize="14sp"
        android:textColor="#616161"
        android:fontFamily="sans-serif-medium"
        android:layout_marginTop="16dp"
        android:layout_marginBottom="16dp" />

    <TextView
        android:id="@+id/team_a_score"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="4dp"
        android:text="0"
        android:textSize="56sp"
        android:textColor="#000000"
        android:fontFamily="sans-serif-light"
        android:layout_marginBottom="24dp"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="8dp"
        android:text="+3 Points"
        android:onClick="addThreeforTeamA" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="8dp"
        android:text="+2 Points"
        android:onClick="addTwoforTeamA" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="8dp"
        android:text="+1 Point"
        android:onClick="addOneforTeamA" />

</LinearLayout>

<View
    android:layout_width="1dp"
    android:layout_height="wrap_content"
    android:background="@android:color/darker_gray"
    android:layout_marginTop="16dp"
    android:layout_marginBottom="50dp"/>

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:padding="4dp"
            android:text="Team B"
            android:textSize="14sp"
            android:textColor="#616161"
            android:fontFamily="sans-serif-medium"
            android:layout_marginTop="16dp"
            android:layout_marginBottom="16dp" />

        <TextView
            android:id="@+id/team_b_score"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:padding="4dp"
            android:text="0"
            android:textSize="56sp"
            android:textColor="#000000"
            android:fontFamily="sans-serif-light"
            android:layout_marginBottom="24dp" />

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="8dp"
            android:text="+3 Points"
            android:onClick="addThreeforTeamB" />

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="8dp"
            android:text="+2 Points"
            android:onClick="addTwoforTeamB" />

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="8dp"
            android:text="+1 Point"
            android:onClick="addOneforTeamB" />

    </LinearLayout>


</LinearLayout>

<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="Reset"
android:onClick="reset" />

</RelativeLayout>

JAVA

package com.example.android.courtcounter;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    int scoreTeamA=0;
int scoreTeamB=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    /**
     * Displays the given score for Team A.
     */
    public void displayForTeamA(int score) {
        TextView scoreView = (TextView) findViewById(R.id.team_a_score);
        scoreView.setText(String.valueOf(score));
    }

    /**
     * Displays the given score for Team B.
     */
    public void displayForTeamB(int score) {
        TextView scoreView = (TextView) findViewById(R.id.team_b_score);
        scoreView.setText(String.valueOf(score));
    }

    public void addThreeforTeamA(View v) {
        scoreTeamA+=3;
        displayForTeamA(scoreTeamA);
    }

    public void addTwoforTeamA(View v) {
        scoreTeamA+=2;
        displayForTeamA(scoreTeamA);
    }

    public void addOneforTeamA(View v) {
        scoreTeamA+=1;
        displayForTeamA(scoreTeamA);
    }

    public void addThreeforTeamB(View v) {
     scoreTeamB+=3;
     displayForTeamB(scoreTeamB); }

    public void addTwoforTeamB(View v) {
    scoreTeamB+=2;
    displayForTeamB(scoreTeamB); }

   public void addOneforTeamB(View v) {
   scoreTeamB+=1;
   displayForTeamB(scoreTeamB); }

   public void reset(View v) {
   scoreTeamA=0;
   scoreTeamB=0;
   displayForTeamA(scoreTeamA);
   displayForTeamB(scoreTeamB); }

}

2 个答案:

答案 0 :(得分:0)

为每个团队设置一个附加变量,每次按下按钮时更新其值。此版本只能撤消最后一个操作。如果您希望能够撤消以前添加的所有值,则必须使用以前添加的所有值的列表。

团队A的例子:

int lastAddA=0;

public void addThreeforTeamA(View v) {
    scoreTeamA+=3;
    lastAddA = 3;
    displayForTeamA(scoreTeamA);
}

public void undoLastTeamA(View v) {
    scoreTeamA-=lastAddA;
    lastAddA = 0;//Reset to default
    displayForTeamA(scoreTeamA);
}

答案 1 :(得分:0)

撤消问题请求使用Stack,因为它是后进先出(LIFO)和高效的数据结构。这意味着,在您的情况下,每次添加新分数时,它都将位于顶部。之前的分数将位于其下方,依此类推。因此,当您开始撤消您只需从顶部元素pop()撤消时,从分数中减去它,然后重新显示分数。

由于堆栈非常容易实现,并且因为您可以添加几个小的修改以帮助您的程序,我认为这是您自己创建自己的轻量级ScoreStack的时间之一;像这样:

public class ScoreStack {
    private class ScoreNode {
        int score;
        ScoreNode next;

        ScoreNode(int score, ScoreNode next) {
            this.score = score;
            this.next = next;
        }
    }

    private int score = 0;
    private ScoreNode root = null;

    public void push(int score) {
        root = new ScoreNode(score, root);
        this.score += score;
    }

    public int pop() {
        if (root == null) {
            return 0;
        }
        int score = root.score;
        root = root.next;
        this.score -= score;
        return score;
    }

    public void reset() {
        root = null;
    }

    @Override
    public String toString() {
        return String.valueOf(score);
    }
}

通过这种方式,您可以跟踪不断变化的分数,提供一种以String格式获得当前分数的简单方法,并且相对容易和高效地完成所有这些操作。当然,这会稍微改变你的设计 ,所以这是一个例子。

public void addOneforTeamA(View v) {
    aTeamStack.push(1);
    displayForTeamA();
}

public void undoLastForA() {
    aTeamStack.pop();
    displayForTeamA();
}

public void displayForTeamA() {
    ((TextView) findViewById(R.id.team_a_score)).setText(aTeamStack);
}


<小时/> 相依 此外,您可以考虑进行一些改进。当您在仅通过签名区分的方法中提供相同的功能时,这可能表示设计可能更好。例如,displayForTeamA()及其TeamB 的对应部分可以是displayScore(int id, String score);像这样:

public void displayScore(int id, String score) {
    ((TextView) findViewById(id)).setText(score);
}

并称之为:

displayScore(R.id.team_a_score, aTeamStack);

对于您拥有的所有团队特定方法都是如此。也就是说,只需花一点时间设计就可以获得更清晰的效果。