2013-03-09 115 views
0

我是Android的新开发人员,不幸的是我的第一个应用程序给出错误。我正在开发一个简单的温度转换器。第一个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)); 
     } 
    } 
} 

我查了大量的线程在这里,但力GET解决方案呢。

+4

什么是错误发表您的logcat跟踪所有的 – DjHacktorReborn 2013-03-09 18:40:20

+0

首先,什么是错误? Logcat输出在哪里 – 2013-03-09 18:40:34

+0

哪里是你的错误? :) – cara 2013-03-09 18:40:40

回答

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。

0

试试这个。

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

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"和上次在button在布局中设置的android:onClick="doconvert"为@ user113215编辑答案。

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); 

    } 
相关问题