第一个android应用程序出错

时间:2013-03-09 18:39:11

标签: android eclipse

我是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>

activity_main.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));
        }   
    }
}

我在这里检查了很多线程,但是dint得到了解决方案。

3 个答案:

答案 0 :(得分: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()。您需要重命名方法{{1}}或编辑XML。

答案 1 :(得分: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"并最后在布局中设置android:onClick="doconvert"中的button作为@ user113215编辑的答案。

答案 2 :(得分: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);

    }