2013-03-09 3 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)); 
     } 
    } 
} 

Я проверил много ниток здесь, но вмятина решение ПОЛУЧИТЬ еще.

+4

, что это ошибка разместим ваш LogCat след – DjHacktorReborn

+0

Прежде всего, что такое ошибка ?! где находится вывод Logcat –

+0

и где ваша ошибка? :) – cara

ответ

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

Редактировать эту строку в доконовном методе.

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 отредактированный ответ.

0

Move это

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

    } 
Смежные вопросы