Android-注册按钮单击并根据选择的电台采取行动

Android-注册按钮单击并根据选择的电台采取行动,android,button,radio-button,Android,Button,Radio Button,我试图教自己如何编写android应用程序,但我很难注册按钮点击并根据当时选择的单选按钮采取行动。这是一个简单的提示计算器: import android.app.Activity; import android.os.Bundle; import android.widget.Button; import android.widget.EditText; import android.widget.RadioButton; import android.widget.TextView; imp

我试图教自己如何编写android应用程序,但我很难注册按钮点击并根据当时选择的单选按钮采取行动。这是一个简单的提示计算器:

import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.TextView;
import android.widget.RadioGroup;
import android.view.View;

public class TipCalc extends Activity implements RadioGroup.OnCheckedChangeListener,View.OnClickListener
{
    TextView result;
    RadioGroup radiogroup1;
    RadioButton r1,r2,r3;
    Button calculate;
    EditText bill, resulttotal;
    private int radioCheckedId = -1;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        radiogroup1 = (RadioGroup) findViewById(R.id.radiogroup1);
        Button calculate = (Button) findViewById(R.id.calculate); 
        RadioButton r1 = (RadioButton) findViewById(R.id.poor);
        RadioButton r2 = (RadioButton) findViewById(R.id.average);
        RadioButton r3 = (RadioButton) findViewById(R.id.excellent);
        EditText bill = new EditText(this);
        EditText resulttotal = new EditText(this);
        radiogroup1.setOnCheckedChangeListener(this);
        calculate.setOnClickListener(this); 
        //bill.setText("0");
        //resulttotal.setText("0");
     }

    public void onCheckedChanged(RadioGroup group, int checkedId) {
        radioCheckedId = checkedId;
    }

    public void onClick(View v)
        {
            if (v == calculate)
           {
                String billtotal;
                double total = 0;
                billtotal = bill.getText().toString();
                final int aInt = Integer.parseInt(billtotal);
                if (radioCheckedId == 1)
                {
                    total = aInt * 1.1;
                    final String aString = Double.toString(total);
                    resulttotal.setText(aString);
                }
               if (radioCheckedId == 2)
                {
                    total = aInt * 1.15;
                    final String aString = Double.toString(total);
                    resulttotal.setText(aString);
                }
               if (radioCheckedId == 3)
               {
                    total = aInt * 1.2;
                    final String aString = Double.toString(total);
                    resulttotal.setText(aString);
               }
            }
        }
}

所有内容都可以正常加载,但当我在虚拟手机中按下“计算”按钮时,什么都不会发生。

您的问题是,您从未将EditText实例添加到当前布局中


您应该将它们作为主布局的子级添加。

问题在于您在哪里比较所选id。。。您需要将onClick()更改为:

给你的将是视图的R.id,而不仅仅是一个数字,告诉你它是在序列中

一些快速(不相关)的建议:

  • 使用switch语句而不是一堆if语句
  • 在那里放一些东西来检查-1(未检查)也。。。只是想确定一下
  • 在onClick()中,我通常通过检查传入视图的id来检查单击了哪个视图。这只会使您不必保存所有内容,并且(IMHO)更清楚地了解您在谈论什么
上述建议大致如下:

public void onClick(View v) {
    if (v.getId() == R.id.calculate) {
        String billtotal;
        double total = 0;
        billtotal = bill.getText().toString();
        final int aInt = Integer.parseInt(billtotal);
        switch(radioCheckedId) {
            case R.id.poor:
                total = aInt * 1.1;
                final String aString = Double.toString(total);
                resulttotal.setText(aString);
                break;
            case R.id.average:
                total = aInt * 1.15;
                final String aString = Double.toString(total);
                resulttotal.setText(aString);
                break;
            case R.id.excellent:
                total = aInt * 1.2;
                final String aString = Double.toString(total);
                resulttotal.setText(aString);
                break;
            default:
                // do something for when nothing is selected... maybe throw an error?
                break;
        }
    }
}
public void onClick(View v) {
    int radioCheckedId = radiogroup1.getCheckedRadioButtonId();
    if (v == calculate) {
        // ...
最后,如果您在onCheckedChanged()中所做的全部工作都是存储值,那么您可以将其全部删除,然后在onClick()中检查它。比如:

public void onClick(View v) {
    if (v.getId() == R.id.calculate) {
        String billtotal;
        double total = 0;
        billtotal = bill.getText().toString();
        final int aInt = Integer.parseInt(billtotal);
        switch(radioCheckedId) {
            case R.id.poor:
                total = aInt * 1.1;
                final String aString = Double.toString(total);
                resulttotal.setText(aString);
                break;
            case R.id.average:
                total = aInt * 1.15;
                final String aString = Double.toString(total);
                resulttotal.setText(aString);
                break;
            case R.id.excellent:
                total = aInt * 1.2;
                final String aString = Double.toString(total);
                resulttotal.setText(aString);
                break;
            default:
                // do something for when nothing is selected... maybe throw an error?
                break;
        }
    }
}
public void onClick(View v) {
    int radioCheckedId = radiogroup1.getCheckedRadioButtonId();
    if (v == calculate) {
        // ...
不相关,但我注意到另一个问题(还有其他人提到)。。。如果XML布局中列出了您的钩子,那么您需要像这样获得钩子(而不是创建新的钩子):


此外,如果您不需要编辑结果,您可能只需要使用一个而不是一个EditView来编辑结果。

我也有一些类似的问题。我在一个广播小组活动中有一个倒计时。
import java.text.NumberFormat;
import java.util.Locale;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.TextView;
import android.widget.RadioGroup;
import android.view.View;

public class TipCalc extends Activity
{
    TextView result;
    RadioGroup radiogroup1;
    RadioButton r1,r2,r3;
    Button calculate;
    EditText bill, resulttotal;
    Locale currentLocale = Locale.getDefault();

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        radiogroup1 = (RadioGroup) findViewById(R.id.radiogroup1);
        final Button calculate = (Button) findViewById(R.id.calculate); 
        final RadioButton r1 = (RadioButton) findViewById(R.id.poor);
        final RadioButton r2 = (RadioButton) findViewById(R.id.average);
        final RadioButton r3 = (RadioButton) findViewById(R.id.excellent);
        final EditText bill = (EditText) findViewById(R.id.bill);
        final EditText tiptotal = (EditText) findViewById(R.id.tiptotal);
        final EditText resulttotal = (EditText) findViewById(R.id.resulttotal);
        bill.setText("0.00");
        tiptotal.setText("0.00");
        resulttotal.setText("0.00");
        calculate.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) throws  NumberFormatException {
                if (v == calculate)
                {
                NumberFormat currencyFormatter;
                currencyFormatter = NumberFormat.getCurrencyInstance(currentLocale);
                double atotal = 0;
                    double btotal = 0;
                    String billtotal = bill.getText().toString();
                    Double aDbl = 0.00;
                    try
                    {
                        aDbl = Double.parseDouble(billtotal);
                    }
                    catch(NumberFormatException n)
                    {
                        aDbl = 0.00;
                    }
                    if (r1.isChecked())
                     {
                        atotal = aDbl * 1.1;
                        btotal = aDbl * 0.1;
                     }
                    if (r2.isChecked())
                     {
                        atotal = aDbl * 1.15;
                        btotal = aDbl * 0.15;
                    }
                    if (r3.isChecked())
                    {
                        atotal = aDbl * 1.2;
                        btotal = aDbl * 0.2;
                    }
                    final String bString = currencyFormatter.format(btotal);
                    tiptotal.setText(bString);
                    final String aString = currencyFormatter.format(atotal);
                    resulttotal.setText(aString);
                 }
            }
        });

     }
}
当用户单击“下一步”按钮时,将检查单选组以查看是否选择了某个选项。 我实现了倒计时结束时按下的按钮,现在我需要传递一个选中的无线电Id,以绕过未选中选项的默认用户消息

案例R.id.next:

        Log.d(" ID BOTAO",((java.lang.String) String).valueOf(rGroup3.getCheckedRadioButtonId()));

            if(rGroup3.getCheckedRadioButtonId()==-1){
                Context context = getApplicationContext();
                CharSequence text = "Please, select an option!";                    
                int duration = Toast.LENGTH_SHORT;
                Toast toast = Toast.makeText(context, text, duration);
                toast.show();
                break;

            }

你是说换成这个?EditText bill=(EditText)findViewById(R.id.bill);EditText resulttotal=(EditText)findViewById(R.id.resulttotal);这是一个问题,但不是问题所在。将它们添加到当前布局而不是作为孩子添加会造成什么损害?决定不使用switch语句,因为只有3个选项,而且似乎没有必要,尽管这样会更干净。我在xml文档中选中了一个单选按钮,因此确实没有办法不选中一个,但我认为安全总比抱歉好。我找到的解决方案(贴在下面)与我如何处理onclicklistener有关。是的,切换是一种个人偏好。看起来你的解决方案也应该有效。