[英]Null Pointer Exception in android when switching activities
我剛開始為 Android 編程,當時我的老板讓我為他制作一個移動應用程序,所以我在兩天內完成了所有這些並在我做的時候自學,主要來自這個網站。 當我運行程序並單擊切換下一個活動的按鈕時,我不斷收到 nullPointerException
第一項活動:
package com.Android.HelpDeskMobileApp;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class HelpDeskFront extends Activity{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first);
Button serviceButton = (Button)findViewById(R.id.serviceButton),
orderButton = (Button)findViewById(R.id.OrderButton),
programmingButton = (Button)findViewById(R.id.ProgrammingButton);
serviceButton.setOnClickListener(buttonListener);
orderButton.setOnClickListener(buttonListener);
programmingButton.setOnClickListener(buttonListener);
}
private OnClickListener buttonListener = new OnClickListener() {
public void onClick(View v) {
String serviceType = null;
Intent i = new Intent(HelpDeskFront.this, Main.class);
if (v.getId() == R.id.serviceButton)
serviceType = "service";
else if (v.getId() == R.id.OrderButton)
serviceType = "order";
else if (v.getId() == R.id.ProgrammingButton)
serviceType = "programming";
i.putExtra("serviceType", serviceType);
startActivityForResult(i, Intent.FILL_IN_DATA);
};
}
按鈕導致我的第二個活動:
package com.Android.HelpDeskMobileApp;
import java.util.ArrayList;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class Main extends Activity{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final Button send = (Button)findViewById(R.id.sendRequest);
send.setOnClickListener(buttonListener);
}
private OnClickListener buttonListener = new OnClickListener() {
ArrayList<NameValuePair> data = new ArrayList<NameValuePair>(5);
final EditText caller = (EditText) findViewById(R.id.CallerEnter),
callExt = (EditText) findViewById(R.id.CallNumberEnter),
computerName = (EditText) findViewById(R.id.ComputerNameEnter),
location = (EditText) findViewById(R.id.LocationEnter),
request = (EditText) findViewById(R.id.RequestEnter);
public void onClick(View v) {
Intent i = getIntent();
final String serviceType = i.getStringExtra("serviceType");
Intent intent = new Intent(Main.this, HelpDeskEnd.class);
final String[] email = {"target emails"};
data.add(new BasicNameValuePair("Caller: ", textToString(caller)));
data.add(new BasicNameValuePair("Call Ext: ", textToString(callExt)));
data.add(new BasicNameValuePair("Computer Name: ", textToString(computerName)));
data.add(new BasicNameValuePair("Locations: ", textToString(location)));
data.add(new BasicNameValuePair("Request: ", textToString(request)));
sendData(data);
String body = data.get(0).toString() + " " + data.get(1).toString() + " " +
data.get(2).toString() + " " + data.get(3).toString() + " " +
data.get(4).toString();
Mail mail = new Mail("an email", "email password");
mail.setTo(email);
mail.setBody(body);
mail.setFrom("an email");
mail.setSubject(serviceType);
try {
mail.send();
}
catch (Exception e) {
Log.e("Send Mail", e.getMessage(), e);
}
intent.putExtra("serivceType", serviceType);
startActivity(intent);
}
};
private String textToString(EditText x)
{
return x.getText().toString();
}
private void sendData(ArrayList<NameValuePair> data)
{
try {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost("https//www.awebsite.com/phpfile.php");
httpPost.setEntity(new UrlEncodedFormEntity(data));
HttpResponse response = httpclient.execute(httpPost);
Log.i("postData", response.getStatusLine().toString());
}
catch (Exception e){
Log.e("log_tag", "Error: " + e.toString());
}
}
}
這可能是一些非常容易解決的問題。 謝謝你的幫助。 這是我的清單文件,我也不知道它是否有用,但它是:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.Android.HelpDeskMobileApp"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="12" />
<uses-permission android:name="android.permission.INTERNET" />
<application android:icon="@drawable/logo" android:label="@string/app_name">
<activity android:name=".HelpDeskFront"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:label="@string/app_name"
android:name=".Main">
<intent-filter></intent-filter>
</activity>
<activity android:label="@string/app_name"
android:name=".HelpDeskEnd">
<intent-filter></intent-filter>
</activity>
</application>
</manifest>
當我從第一個活動到 the.main 活動按下 go 的按鈕時,就會發生錯誤。 我嘗試注釋掉代碼的不同部分,但我無法弄清楚是什么導致了 Null 指針異常。 謝謝。 日志貓:
07-13 18:37:29.833: ERROR/AndroidRuntime(770): FATAL EXCEPTION: main
07-13 18:37:29.833: ERROR/AndroidRuntime(770): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.Android.HelpDeskMobileApp/com.Android.HelpDeskMobileApp.Main}: java.lang.NullPointerException
07-13 18:37:29.833: ERROR/AndroidRuntime(770): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1672)
07-13 18:37:29.833: ERROR/AndroidRuntime(770): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1764)
07-13 18:37:29.833: ERROR/AndroidRuntime(770): at android.app.ActivityThread.access$1500(ActivityThread.java:122)
07-13 18:37:29.833: ERROR/AndroidRuntime(770): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1002)
07-13 18:37:29.833: ERROR/AndroidRuntime(770): at android.os.Handler.dispatchMessage(Handler.java:99)
07-13 18:37:29.833: ERROR/AndroidRuntime(770): at android.os.Looper.loop(Looper.java:132)
07-13 18:37:29.833: ERROR/AndroidRuntime(770): at android.app.ActivityThread.main(ActivityThread.java:4025)
07-13 18:37:29.833: ERROR/AndroidRuntime(770): at java.lang.reflect.Method.invokeNative(Native Method)
07-13 18:37:29.833: ERROR/AndroidRuntime(770): at java.lang.reflect.Method.invoke(Method.java:491)
07-13 18:37:29.833: ERROR/AndroidRuntime(770): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
07-13 18:37:29.833: ERROR/AndroidRuntime(770): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
07-13 18:37:29.833: ERROR/AndroidRuntime(770): at dalvik.system.NativeStart.main(Native Method)
07-13 18:37:29.833: ERROR/AndroidRuntime(770): Caused by: java.lang.NullPointerException
07-13 18:37:29.833: ERROR/AndroidRuntime(770): at android.app.Activity.findViewById(Activity.java:1744)
07-13 18:37:29.833: ERROR/AndroidRuntime(770): at com.Android.HelpDeskMobileApp.Main$1.<init>(Main.java:35)
07-13 18:37:29.833: ERROR/AndroidRuntime(770): at com.Android.HelpDeskMobileApp.Main.<init>(Main.java:31)
07-13 18:37:29.833: ERROR/AndroidRuntime(770): at java.lang.Class.newInstanceImpl(Native Method)
07-13 18:37:29.833: ERROR/AndroidRuntime(770): at java.lang.Class.newInstance(Class.java:1301)
07-13 18:37:29.833: ERROR/AndroidRuntime(770): at android.app.Instrumentation.newActivity(Instrumentation.java:1022)
07-13 18:37:29.833: ERROR/AndroidRuntime(770): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1663)
07-13 18:37:29.833: ERROR/AndroidRuntime(770): ... 11 more
HelpDeskFront.startActivity(intent);
解決這個問題?
私人 OnClickListener buttonListener = new OnClickListener() {
public void onClick(View v) {
String serviceType = null;
Intent i = new Intent(HelpDeskFront.this, Main.class);
switch (v.getId()) {
case R.id.serviceButton :
serviceType = "service";
break;
case R.id.OrderButton :
serviceType = "order";
break;
case R.id.ProgrammingButton :
serviceType = "programming";
break;
}
i.putExtra("serviceType", serviceType);
startActivity(i);// change this to startActivityForResult(yourintent,Intent.FILL_IN_DATA)
}
};
乍一看只是一個想法
嘗試像這樣使用 if(view==programmingButton)else if(view==another button) 而不是 switch,你能發布 logcat 並告訴 null 指針異常的代碼(作為 onclick 偵聽器或第二個活動的一部分)。 .
這是 Main 的第 34 行。 logcat output 中“Caused by”下的行是相關信息通常所在的位置。
好吧,罪魁禍首應該是初始化程序
Intent i = getIntent();
final String serviceType = i.getStringExtra("serviceType");
final EditText caller = (EditText) findViewById(R.id.CallerEnter),
callExt = (EditText) findViewById(R.id.CallNumberEnter),
computerName = (EditText) findViewById(R.id.ComputerNameEnter),
location = (EditText) findViewById(R.id.LocationEnter),
request = (EditText) findViewById(R.id.RequestEnter);
發生在 Object 構造函數中。 由於onClickListener
構造函數將在onCreate()
方法之前運行, getIntent()
將返回 null,並且您不會設置 contentView,因此所有 findViewById() 也將返回 null。
正確的方法是:
private OnClickListener buttonListener = new OnClickListener() {
ArrayList<NameValuePair> data = new ArrayList<NameValuePair>(5);
public void onClick(View v) {
Intent i = getIntent();
final String serviceType = i.getStringExtra("serviceType");
final EditText caller = (EditText) findViewById(R.id.CallerEnter),
callExt = (EditText) findViewById(R.id.CallNumberEnter),
computerName = (EditText) findViewById(R.id.ComputerNameEnter),
location = (EditText) findViewById(R.id.LocationEnter),
request = (EditText) findViewById(R.id.RequestEnter);
Intent intent = new Intent(Main.this, HelpDeskEnd.class);
final String[] email = {"target emails"};
data.add(new BasicNameValuePair("Caller: ", textToString(caller)));
data.add(new BasicNameValuePair("Call Ext: ", textToString(callExt)));
data.add(new BasicNameValuePair("Computer Name: ", textToString(computerName)));
data.add(new BasicNameValuePair("Locations: ", textToString(location)));
data.add(new BasicNameValuePair("Request: ", textToString(request)));
sendData(data);
String body = data.get(0).toString() + " " + data.get(1).toString() + " " +
data.get(2).toString() + " " + data.get(3).toString() + " " +
data.get(4).toString();
Mail mail = new Mail("an email", "email password");
mail.setTo(email);
mail.setBody(body);
mail.setFrom("an email");
mail.setSubject(serviceType);
try {
mail.send();
}
catch (Exception e) {
Log.e("Send Mail", e.getMessage(), e);
}
intent.putExtra("serivceType", serviceType);
startActivity(intent);
}
};
錯誤在第 34 行
final String serviceType = i.getStringExtra("serviceType");
這意味着“i”可能沒有正確初始化。
我會嘗試這樣做,以便上下文正確。
Intent i = Main.this.getIntent();
或者您可以像在其他活動中那樣創建一個新意圖。
您的應用程序在其主要活動中的啟動方式存在很多問題!
您需要在 onStart() 方法中而不是在 onCreate() 方法中設置偵聽器。 每次顯示活動時並不總是調用 onCreate()。
您不需要找出使用開關、if/else 或任何如此復雜的東西單擊了哪個按鈕……每個按鈕都有自己的 onClickListener()。 在監聽器中調用一個私有方法來啟動新的活動。
使用 putExtra() 通過 Intent 傳遞您想要的任何數據。
這是一個例子......
public class MainActivity extends Activity {
@Override
public void onCreate( final Bundle savedInstanceState ) {
super.onCreate( savedInstanceState );
this.setContentView( R.layout.main );
}
@Override
protected void onStart() {
super.onStart();
final Button _serviceButton = (Button)this.findViewById( R.id.buttonService );
final Button _orderButton = (Button)this.findViewById( R.id.buttonOrder );
final Button _progButton = (Button)this.findViewById( R.id.buttonProgramming );
_serviceButton.setOnClickListener( new OnClickListener() {
@Override
public void onClick( final View v ) {
MainActivity.this.doSomeButtonClick( "service" );
}
} );
_orderButton.setOnClickListener( new OnClickListener() {
@Override
public void onClick( final View v ) {
MainActivity.this.doSomeButtonClick( "order" );
}
} );
_progButton.setOnClickListener( new OnClickListener() {
@Override
public void onClick( final View v ) {
MainActivity.this.doSomeButtonClick( "programming" );
}
} );
}
private void doSomeButtonClick( final String type ) {
final Intent intent = new Intent( MainActivity.this, Activity1.class );
intent.putExtra( "serviceType", type );
this.startActivity( intent );
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.