问题描述
- FindViewById()引起的应用崩溃
-
如果没有下面这两行代码就正常运行,但是加上应用就会崩溃。EditText convertValue = (EditText) findViewById(R.id.et_value_convert); TextView convertResult = (TextView) findViewById(R.id.txt_result);
完整代码如下:
package com.doubleelite.maxtest; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.widget.EditText; import android.widget.TextView; public class ConverterActivity extends Activity { EditText convertValue = (EditText) findViewById(R.id.et_value_convert); TextView convertResult = (TextView) findViewById(R.id.txt_result); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_converter); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_converter, menu); return true; } // Custom method to handle button clicks. public void onClick(View v) { switch(v.getId()) { case R.id.btn_to_cel: convertResult.setText(String.valueOf(convertFahrenheitToCelsius(Integer.valueOf(convertValue.getText().toString())))); } } private float convertFahrenheitToCelsius(float f) { return (f-32) * (5/9); } private float convertCelsiusToFahrenheit(float c) { return c * (9/5) + 32; } }
XML文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/LinearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".ConverterActivity" > <EditText android:id="@+id/et_value_convert" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:hint="@string/text_value_convert" android:inputType="number" /> <Button android:id="@+id/btn_to_cel" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/button_celsius" android:onClick="onClick" /> <Button android:id="@+id/btn_to_fahr" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/button_fahr" android:onClick="onClick" /> <TextView android:id="@+id/txt_result" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="Medium Text" android:textAppearance="?android:attr/textAppearanceMedium" tools:ignore="HardcodedText" /> </LinearLayout>
解决方案
问题出在你的初始化控件是在onCreate之前,在onCreate方法中有这么一句setContentView(R.layout.activity_converter);意思是将布局加载进来,而你的控件是在布局文件中的,你布局文件都没有加载进来findViewById怎么可能找得到控件呢?
所以应该改成
public class ConverterActivity extends Activity {
EditText convertValue ;
TextView convertResult;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_converter);
convertValue = (EditText) findViewById(R.id.et_value_convert);
convertResult = (TextView) findViewById(R.id.txt_result);
}
解决方案二:
既然是findViewById,那么你现在放的位置还没有进行view的初始化,导致返回的都是null,那么一旦调用就是npe,放到setContentView后面就可以了。
解决方案三:
修改你的代码如下:
public class ConverterActivity extends Activity {
EditText convertValue ;
TextView convertResult;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_converter);
convertValue = (EditText) findViewById(R.id.et_value_convert);
convertResult = (TextView) findViewById(R.id.txt_result);
}
///加上你的代码
时间: 2024-09-19 09:52:58