eclipse 如何从 EditText 处理华氏温度并打印其相应的摄氏温度?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/9169601/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-19 17:41:11  来源:igfitidea点击:

How to process a Fahrenheit temperature from EditText and print its corresponding Celsius temperature?

androideclipsetextview

提问by sameetandpotatoes

I am confused with the concept of creating a Listener in Android. The purpose of my program is simple: to convert between units (such as Fahrenheit to Celsius, Celsius to Fahrenheit, etc.). How do I get the text in the EditText object and then how do I print it out? I am getting an error everytime I run (Unfortunately, Converter.exe has stopped.) Here is my code so far. Please advise.

我对在 Android 中创建侦听器的概念感到困惑。我的程序的目的很简单:单位之间的转换(如华氏度到摄氏度,摄氏度到华氏度等)。如何获取 EditText 对象中的文本,然后如何将其打印出来?每次运行时都会出错(不幸的是,Converter.exe 已停止。)这是我的代码。请指教。

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

public class ConverterActivity extends Activity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button button = (Button) findViewById(R.id.temp_Button);
    button.setOnClickListener(new View.OnClickListener() 
    {
        public void onClick(View v)
        {
            setContentView(R.layout.body);
        }
    });  

    Button ok = (Button) findViewById(R.id.OK_Button);
    ok.setOnClickListener(new View.OnClickListener() 
    {
        public void onClick(View v)
        {
            EditText et = (EditText) getText(0);
            final int num = Integer.parseInt(et.toString());
            double answer = (num - 32) * 5/9;
            TextView tv = (TextView) findViewById(R.id.editText);
            tv.setText(Double.toString(answer));
        }
    });

}
}

I have two layout (.xml) files as well (I am not sure if this is proper programming style).

我也有两个布局 (.xml) 文件(我不确定这是否是正确的编程风格)。

main simply displays the buttons that can be clicked. Then, I have the second .xml file come up after the button is clicked.

main 只是显示可以单击的按钮。然后,在单击按钮后出现第二个 .xml 文件。

main.xml

主文件

<?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" >

<Button
    android:id="@+id/temp_Button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/F" />
 <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/C" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/I" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/Cm" />

 </LinearLayout>

body.xml (the second one)-

body.xml(第二个)-

<?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="wrap_content"
android:orientation="vertical" >

<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:text="Enter temperature:" />

<EditText
    android:id="@+id/editText"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:background="@android:drawable/editbox_background"
    android:digits="1, 2, 3, 4, 5, 6, 7, 8, 9" />

<Button
    android:id="@+id/cancel_Button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Cancel" />

<Button
    android:id="@+id/OK_Button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="OK" />

 </LinearLayout>

Just to reiterate, my problem occurs with this segment of code:

重申一下,我的问题出现在这段代码中:

 Button ok = (Button) findViewById(R.id.OK_Button);
   ok.setOnClickListener(new View.OnClickListener() 
   {
       public void onClick(View v)
        {
            EditText et = (EditText) getText(0);
            final int num = Integer.parseInt(et.toString());
            double answer = (num - 32) * 5/9;
           TextView tv = (TextView) findViewById(R.id.editText);
           tv.setText(Double.toString(answer));
        }
   });

The intent is to get the number from the EditText object that the user inputs, convert it, and print it back out, but I'm not sure if I'm doing this right, or if this is even in the right place.

目的是从用户输入的 EditText 对象中获取数字,将其转换,然后将其打印出来,但我不确定我这样做是否正确,或者这是否在正确的位置。

**UPDATE: Here is log.

**更新:这是日志。

02-06 19:53:36.148: D/AndroidRuntime(529): Shutting down VM
02-06 19:53:36.158: W/dalvikvm(529): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
02-06 19:53:36.168: E/AndroidRuntime(529): FATAL EXCEPTION: main
02-06 19:53:36.168: E/AndroidRuntime(529): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sapra.converter/com.sapra.converter.ConverterActivity}: java.lang.NullPointerException
02-06 19:53:36.168: E/AndroidRuntime(529):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
02-06 19:53:36.168: E/AndroidRuntime(529):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
02-06 19:53:36.168: E/AndroidRuntime(529):  at android.app.ActivityThread.access0(ActivityThread.java:123)
02-06 19:53:36.168: E/AndroidRuntime(529):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
02-06 19:53:36.168: E/AndroidRuntime(529):  at android.os.Handler.dispatchMessage(Handler.java:99)
02-06 19:53:36.168: E/AndroidRuntime(529):  at android.os.Looper.loop(Looper.java:137)
02-06 19:53:36.168: E/AndroidRuntime(529):  at android.app.ActivityThread.main(ActivityThread.java:4424)
02-06 19:53:36.168: E/AndroidRuntime(529):  at java.lang.reflect.Method.invokeNative(Native Method)
02-06 19:53:36.168: E/AndroidRuntime(529):  at java.lang.reflect.Method.invoke(Method.java:511)
02-06 19:53:36.168: E/AndroidRuntime(529):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
02-06 19:53:36.168: E/AndroidRuntime(529):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
02-06 19:53:36.168: E/AndroidRuntime(529):  at dalvik.system.NativeStart.main(Native Method)
02-06 19:53:36.168: E/AndroidRuntime(529): Caused by: java.lang.NullPointerException
02-06 19:53:36.168: E/AndroidRuntime(529):  at com.sapra.converter.ConverterActivity.onCreate(ConverterActivity.java:29)
02-06 19:53:36.168: E/AndroidRuntime(529):  at android.app.Activity.performCreate(Activity.java:4465)
02-06 19:53:36.168: E/AndroidRuntime(529):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
02-06 19:53:36.168: E/AndroidRuntime(529):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
02-06 19:53:36.168: E/AndroidRuntime(529):  ... 11 more

回答by adneal

This is pretty straight forward, I think you can figure it out from here.

这很简单,我想你可以从这里弄清楚。

// This is the TextView you set in your layout. It will display the temperature.
    final TextView tv = (TextView) findViewById(R.id.tv);

    // This sets up the EditText so you can capture the input and return the temperature.
    final EditText edittext = (EditText) findViewById(R.id.et);
    edittext.setOnKeyListener(new OnKeyListener() {
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // If the event is a key-down event on the "enter" button
            if ((event.getAction() == KeyEvent.ACTION_DOWN)
                    && (keyCode == KeyEvent.KEYCODE_ENTER)) {
                // Perform action on key press
                float f = Float.parseFloat(edittext.getText().toString());
                tv.setText(String.valueOf(convertCelciusToFahrenheit(f)));
                return true;
            }
            return false;
        }
    });

}

// Converts to celcius
private float convertFahrenheitToCelcius(float fahrenheit) {
    return ((fahrenheit - 32) * 5 / 9);
}

// Converts to fahrenheit
private float convertCelciusToFahrenheit(float celsius) {
    return ((celsius * 9) / 5) + 32;
}

回答by Sergey Benner

Just as an example. I wrote this sample temp converter awhile ago. Perhaps somebody might find it useful.

举个例子。不久前我写了这个示例温度转换器。也许有人会发现它很有用。



public class TempTest extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LinearLayout ll = new LinearLayout(this);           
        ll.setOrientation(1);
        Button b = new Button(this);
        b.setText("get temperature");
        b.setOnClickListener(new View.OnClickListener(){
            public void onClick(View view) {
                   getCelciusOrFarenheit();
            }
        });
        ll.addView(b);
        setContentView(ll);
    }

    public AlertDialog getCelciusOrFarenheit(){
    AlertDialog.Builder cof = new AlertDialog.Builder(this);
    cof.setTitle("Select Temperature Conversion");
    String[] types = {"To Celcius", "To Farenheit"};
    cof.setItems(types, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
            switch(which){
            case 0:
                createTempDialog(true).show();
                break;
            case 1:
                createTempDialog(false).show();
                break;
            }
        }
    });
    return cof.show();
    }
    public AlertDialog createTempDialog(final boolean cf){
       final EditText et = new EditText(this);
       et.setInputType(InputType.TYPE_CLASS_NUMBER|InputType.TYPE_NUMBER_FLAG_DECIMAL);
       final Formatter f = new Formatter();
       return new AlertDialog.Builder(this).setView(et).setTitle(cf?"Enter Farenheit temperature":"Enter Celcius temperature").setPositiveButton("OK", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialogInterface, int i) {
               double answer = 0;
               if (cf) {
                   answer = (Double.parseDouble(et.getText().length() > 1 ? et.getText().toString() : "0") - 32) * 5 / 9;
               } else {
                   answer = Double.parseDouble(et.getText().length() > 1 ? et.getText().toString() : "0")*9/5 + 32;
               }
               new AlertDialog.Builder(TempTest.this).setMessage(f.format("%.2f", answer).toString()).setTitle(cf?"Celcius":"Farenheit")
                       .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                           public void onClick(DialogInterface dialogInterface, int i) {
                               dialogInterface.dismiss();
                           }
                       })
                       .create().show();
           }
       }).create();
    }

}