0

我是 Android 的新开发人员,不幸的是我的第一个应用程序出错了。我正在开发一个简单的温度转换器。

这些是文件。

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.tempconv"
    android:versionCode="1"
    android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="17" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
<activity
    android:name="com.example.tempconv.MainActivity"
    android:label="@string/app_name" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
</application>

</manifest>

活动主.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >

<EditText
    android:id="@+id/ipdata"
    android:hint="Enter temperature"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="22dp"
    android:ems="10" />

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/ipdata"
    android:layout_below="@+id/ipdata"
    android:layout_marginTop="15dp"
    android:text="Select Conversion" />

<RadioButton
    android:id="@+id/ctof"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/textView1"
    android:layout_below="@+id/textView1"
    android:layout_marginLeft="25dp"
    android:layout_marginTop="18dp"
    android:text="Celsius to Feherenhit" />

<RadioButton
    android:id="@+id/ftoc"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/ctof"
    android:layout_below="@+id/ctof"
    android:text="Feherenhit to Celsius" />

<EditText
    android:id="@+id/opdata"
    android:hint="Hit below button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/textView1"
    android:layout_below="@+id/ftoc"
    android:layout_marginTop="54dp"
    android:ems="10" />

<Button
    android:id="@+id/doconvert"
    android:onClick="docon"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/opdata"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="20dp"
    android:text="convert" />

</RelativeLayout>

MainActivity.java:

package com.example.tempconv;

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

public class MainActivity extends Activity {

    RadioButton RD1 = (RadioButton) findViewById(R.id.ctof);
    RadioButton RD2 = (RadioButton) findViewById(R.id.ftoc);
    EditText input = (EditText) findViewById(R.id.ipdata);
    EditText output = (EditText) findViewById(R.id.opdata);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    public void doconvert(View v) {

        float data = Float.parseFloat(input.toString());

        if (RD1.isChecked()){

            float c;
            c = (data-32)*(5/9);
            output.setText(String.valueOf(c));
        }

        else if (RD2.isChecked()){

            float f;
            f=(data*(9/5))+32;
            output.setText(String.valueOf(f));
        }   
    }
}

我在这里检查了很多线程,但还没有找到解决方案。

4

3 回答 3

1

你不能findViewById()早于onCreate()。这是因为还没有加载布局,因此甚至不存在视图。

换句话说,这段代码:

public class MainActivity extends Activity {
    RadioButton RD1 = (RadioButton) findViewById(R.id.ctof);
    RadioButton RD2 = (RadioButton) findViewById(R.id.ftoc);
    EditText input = (EditText) findViewById(R.id.ipdata);
    EditText output = (EditText) findViewById(R.id.opdata);

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

需要是这样的:

public class MainActivity extends Activity {
    public RadioButton RD1, RD2;
    public EditText input, output;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RD1 = (RadioButton) findViewById(R.id.ctof);
        RD2 = (RadioButton) findViewById(R.id.ftoc);
        input = (EditText) findViewById(R.id.ipdata);
        output = (EditText) findViewById(R.id.opdata);
    }

input.toString()不是在文本框中键入的值。为此,您想要input.getText().toString().


在您的activity_main.xml文件中,<Button ... android:onClick="docon">意味着单击该按钮将触发该方法docon()。您需要重命名方法doconvert()或编辑 XML。

于 2013-03-09T18:41:14.630 回答
0

尝试这个。

您必须findViewById在调用该方法后调用一次setContentView

private RadioButton RD1
private RadioButton RD2 
private EditText input;
private EditText output;    

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    RD1 = (RadioButton) findViewById(R.id.ctof);
    RD2 = (RadioButton) findViewById(R.id.ftoc);
    input = (EditText) findViewById(R.id.ipdata);
    output = (EditText) findViewById(R.id.opdata);
}

在 doconvert 方法中编辑此行。

float data = Float.parseFloat(input.getText().toString());

在您的布局中进行编辑。

<EditText
    android:id="@+id/ipdata"
    android:hint="Enter temperature"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="22dp"
    android:ems="10" 
    android:inputType="number"/>   <<<Add this line to force user to enter the numeric value.

将此输入类型设置为数字,因为用户可以在edittext类似文本中输入任何内容,然后NumberFormatException将在此行抛出。

float data = Float.parseFloat(input.getText().toString());

因此,您还希望用户输入数字,然后将布局中的和android:inputType="number"最后设置为@user113215 编辑的答案。android:onClick="doconvert"button

于 2013-03-09T18:42:10.183 回答
0

移动这个

RadioButton RD1 = (RadioButton) findViewById(R.id.ctof);
RadioButton RD2 = (RadioButton) findViewById(R.id.ftoc);
EditText input = (EditText) findViewById(R.id.ipdata);
EditText output = (EditText) findViewById(R.id.opdata);

像这样

RadioButton RD1
RadioButton RD2 
EditText input;
EditText output;   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
     RD1 = (RadioButton) findViewById(R.id.ctof);
        RD2 = (RadioButton) findViewById(R.id.ftoc);
        input = (EditText) findViewById(R.id.ipdata);
        output = (EditText) findViewById(R.id.opdata);

    }
于 2013-03-09T18:42:29.863 回答