只有在单击与之关联的按钮两次后才能通过EditText显示正确的输出

时间:2012-05-18 11:14:34

标签: java android

我正在编写一个小代码来将一种货币转换为另一种货币。 该应用程序通过EditText接受两个值(配置为接受十进制数字) - 1)主页或客场货币(如果填写一个,另一个的字段留空)2)汇率。

以下是代码:

package kk.currency;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class CurrencyActivity extends Activity {
    /** Called when the activity is first created. */

    EditText inpval1;
    EditText inpval2;
    EditText rate;

    int v1 = 0;
    int v2 = 0;
    int r = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    public void btnclick(View view)  {
        try {
            inpval1 = (EditText)findViewById(R.id.away);
            v1 = Integer.parseInt(inpval1.getText().toString());

            inpval2 = (EditText)findViewById(R.id.home);
            v2 = Integer.parseInt(inpval2.getText().toString());

            rate = (EditText)findViewById(R.id.rate);
            r = Integer.parseInt(rate.getText().toString()); 
        }
        catch (Exception e) {
            Toast.makeText(this, "Empty field", Toast.LENGTH_SHORT).show();
        }
        finally {
            v1 = v2 * r;

            EditText destination = (EditText)findViewById(R.id.away);
            destination.setText(Integer.toString(v1));
        }
    }   
}

问题是,在点击与“btnclick”关联的按钮时,无论输入什么输入,空白的字段(以及应该显示答案的位置)都会显示0。但是再次点击时会显示正确的答案。

如果我在应该留空的字段中放置任何值,则在第一次显示正确的值。

可能是什么问题?!

在删除'finally'并将其内容放入'try'后,我点击按钮后甚至没有得到任何回复。

此外,在执行应用程序期间,LogCat完全为空。

以下是有人要求的应用布局。

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="25dip"
    android:layout_marginLeft="5dip"
    android:text="@string/away"
    android:textStyle="bold"
    android:textSize="20dip"
    android:textColor="#4199ae" />

<EditText
    android:id="@+id/away"
    android:digits="0123456789."
    android:inputType="number"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dip"
    android:hint="@string/c1" />

<TextView 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="25dip"
    android:layout_marginLeft="5dip"
    android:text="@string/conv"
    android:textStyle="bold"
    android:textSize="20dip"
    android:textColor="#4199ae" />

<EditText
    android:id="@+id/rate"
    android:digits="0123456789."
    android:inputType="number"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dip"
    android:hint="@string/rate" />

<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="25dip"
    android:layout_marginLeft="5dip"
    android:text="@string/home"
    android:textStyle="bold"
    android:textSize="20dip"
    android:textColor="#4199ae" />

<EditText
    android:id="@+id/home"
    android:digits="0123456789."
    android:inputType="number"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dip"
    android:hint="@string/c2" />

<Button
    android:id="@+id/but"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="25dip"
    android:text="@string/buttxt"
    android:onClick="btnclick" />

3 个答案:

答案 0 :(得分:1)

我的回复来自Reddit:

您的问题是因为您没有处理用户可能拥有的各种可能输入。 在第一步,在这一行

  

v1 = Integer.parseInt(inpval1.getText()。toString());

的值
  

inpval1.getText()。的toString()

返回&#34;&#34;,无法转换为整数,因此会导致异常。你应该看到&#34;空字段&#34;吐司出现。 所以在那之后,它进入了最后一步,但是因为v2和r仍然是0,所以它在v1中放置0,并在离开的EditText中放置0。

下次运行时,它会从Away EditText中获得0,并且正常运行。 你知道怎么做调试吗?如果您正在使用Eclipse,请双击要暂停的行,在左侧,灰色/蓝色栏中,这将放置一个断点图标,程序将停在那里。

因此,如果要么在开头删除EditText的值,那么它应该可以工作。此外,您还希望在此处实现其他一些建议,因为每次单击按钮时都会通过获取指向控件视图的指针来执行一些冗余工作。

祝你好运!

答案 1 :(得分:0)

尝试这种方式,但请记住更改代码以匹配您正在使用的按钮ID。

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class CurrencyActivity extends Activity {
/** Called when the activity is first created. */

    EditText inpval1;
    EditText inpval2;
    EditText rate;
    EditText destination;
    Button mbutt;
    int v1 = 0;
    int v2 = 0;
    int r = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mbutt = (Buttn)findViewById(R.id.SubmitButton);
        inpval1 = (EditText)findViewById(R.id.away);
        inpval2 = (EditText)findViewById(R.id.home);
        rate = (EditText)findViewById(R.id.rate);
        EditText destination = (EditText)findViewById(R.id.away);

        mbutt.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                         v1 = Integer.parseInt(inpval1.getText().toString());
                         v2 = Integer.parseInt(inpval2.getText().toString());
                         r = Integer.parseInt(rate.getText().toString()); 
                         v1 = v2 * r;
                         destination.setText(Integer.toString(v1));
                }
            });
    }    
}

答案 2 :(得分:0)

尝试不使用try catch块,但如果您仍想坚持这一点,那么请将代码最终放入try块中,然后删除finally块。

像这样:

public void btnclick(View view)  {

    try {
                 inpval1 = (EditText)findViewById(R.id.away);
                 v1 = Integer.parseInt(inpval1.getText().toString());

                 inpval2 = (EditText)findViewById(R.id.home);
                 v2 = Integer.parseInt(inpval2.getText().toString());

                 rate = (EditText)findViewById(R.id.rate);
                 r = Integer.parseInt(rate.getText().toString()); 

                 v1 = v2 * r;

                  EditText destination = (EditText)findViewById(R.id.away);
                  destination.setText(Integer.toString(v1));
        }

    catch (Exception e) {
        Toast.makeText(this, "Empty field", Toast.LENGTH_SHORT).show();
    }