2015-02-06 148 views
1

我試圖這樣做是爲了將數據保存到我的全局變量:將數據保存到一個全局變量在Java的Android

public static String UnitCode; 
public static String RDate; 
public static String AArea; 

    final EditText unitCode = (EditText) findViewById(R.id.editText1); 
    final EditText reservationDate = (EditText) findViewById(R.id.editText2); 
    final EditText Area = (EditText) findViewById(R.id.editText3); 

      UnitCode = unitCode.getText().toString(); 
      RDate = reservationDate.getText().toString(); 
      AArea = Area.getText().toString(); 

這是我ReservationActivity.class內。

但是每當我訪問它在我的ReservationProcessActivity類:

UnitCode = ReservationActivity.UnitCode.toString(); 
    RDate = ReservationActivity.RDate.toString(); 
    Area = ReservationActivity.AArea.toString(); 

我的Android應用程序突然崩潰只有當我在ReservationProcessActivity取消註釋部分,如果我評論它,它工作正常。我做錯了什麼?

這是logcat的錯誤:

02-06 11:50:10.956: E/AndroidRuntime(16482): FATAL EXCEPTION: main 
02-06 11:50:10.956: E/AndroidRuntime(16482): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.appletest/com.example.appletest.ReservationProcessActivity}: java.lang.NullPointerException 
02-06 11:50:10.956: E/AndroidRuntime(16482): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2308) 
02-06 11:50:10.956: E/AndroidRuntime(16482): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2362) 
02-06 11:50:10.956: E/AndroidRuntime(16482): at android.app.ActivityThread.access$700(ActivityThread.java:168) 
02-06 11:50:10.956: E/AndroidRuntime(16482): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1329) 
02-06 11:50:10.956: E/AndroidRuntime(16482): at android.os.Handler.dispatchMessage(Handler.java:99) 
02-06 11:50:10.956: E/AndroidRuntime(16482): at android.os.Looper.loop(Looper.java:137) 
02-06 11:50:10.956: E/AndroidRuntime(16482): at android.app.ActivityThread.main(ActivityThread.java:5493) 
02-06 11:50:10.956: E/AndroidRuntime(16482): at java.lang.reflect.Method.invokeNative(Native Method) 
02-06 11:50:10.956: E/AndroidRuntime(16482): at java.lang.reflect.Method.invoke(Method.java:525) 
02-06 11:50:10.956: E/AndroidRuntime(16482): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209) 
02-06 11:50:10.956: E/AndroidRuntime(16482): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025) 
02-06 11:50:10.956: E/AndroidRuntime(16482): at dalvik.system.NativeStart.main(Native Method) 
02-06 11:50:10.956: E/AndroidRuntime(16482): Caused by: java.lang.NullPointerException 
02-06 11:50:10.956: E/AndroidRuntime(16482): at com.example.appletest.ReservationProcessActivity.onCreate(ReservationProcessActivity.java:102) 
02-06 11:50:10.956: E/AndroidRuntime(16482): at android.app.Activity.performCreate(Activity.java:5372) 
02-06 11:50:10.956: E/AndroidRuntime(16482): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104) 
02-06 11:50:10.956: E/AndroidRuntime(16482): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2270) 
02-06 11:50:10.956: E/AndroidRuntime(16482): ... 11 more 

這是我ReservationProcessActivity類:

public class ReservationProcessActivity extends Activity { 

    WebView webView; 

    HttpResponse response; 
    HttpClient httpclient; 
    List<NameValuePair> nameValuePairs; 
    StringBuffer buffer; 
    HttpPost httppost; 

    String UnitCode;  
    String RDate;   
    String Area;   

    @Override 
    protected void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.webpayment); 

     webView = (WebView)findViewById(R.id.webView1); 
     webView.getSettings().setLoadWithOverviewMode(true); 
     webView.getSettings().setUseWideViewPort(true); 
     webView.setWebChromeClient(new WebChromeClient()); 
     webView.setWebViewClient(new MyBrowser()); 
     webView.getSettings().setBuiltInZoomControls(false); 
     webView.getSettings().setJavaScriptEnabled(true); 
     webView.setHorizontalScrollBarEnabled(false); 

     UnitCode = ReservationActivity.UnitCode.toString(); 
     RDate = ReservationActivity.RDate.toString(); 
     Area = ReservationActivity.AArea.toString(); 


     webView.loadUrl("http://google.com/"); 

    } 

} 

的ReservationActivity類:

package com.example.appletest; 

import android.app.ActionBar; 
import android.app.Activity; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.graphics.Color; 
import android.graphics.drawable.ColorDrawable; 
import android.os.Bundle; 
import android.support.v4.app.NavUtils; 
import android.text.Html; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.RadioButton; 

public class ReservationActivity extends Activity { 


    public static String UnitCode; 
    public static String RDate; 
    public static String AArea; 

    @Override 
    protected void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.reservation_activity); 

     //button 
     final Button nextButton = (Button) findViewById(R.id.NextButton1); 

     //textbox 
     final EditText unitCode = (EditText) findViewById(R.id.editText1); 
     final EditText reservationDate = (EditText) findViewById(R.id.editText2); 
     final EditText Area = (EditText) findViewById(R.id.editText3); 

     nextButton.setOnClickListener(new View.OnClickListener(){ 

      public void onClick(View v) { 
       // TODO Auto-generated method stub 

       UnitCode = unitCode.getText().toString(); 
       RDate = reservationDate.getText().toString(); 
       AArea = Area.getText().toString();        

       Intent i = new Intent(ReservationActivity.this, ReservationProcessActivity.class); 
       startActivity(i); 
       finish(); 
      } 

     }); 

} 
+0

你在哪裏調用'findViewById'方法?請確保在setContentView之後的onCreate – 2015-02-06 03:51:54

+0

是的,它是在onCreate – marchemike 2015-02-06 03:52:30

+1

顯示更多的代碼,還記錄應用程序崩潰時 – 2015-02-06 03:53:09

回答

1

如果ReservationProcessActivity擁有的onCreate()在同一個JVM一個ReservationActivity的OnCreate之前調用,然後在ReservationActivity靜態變量UnitCode仍然爲空。當你使用這樣的ReservationProcessActivity這樣的:

UnitCode = ReservationActivity.UnitCode.toString(); 

這將導致你的崩潰。我不確定你的活動中發生的事件的順序是什麼,但我認爲類似的事情正在發生。

+0

這個是在這種情況下爲我工作的。然而,對於vasanth的答案+1,因爲它更強大(我實際上已經忘記了setter和getters,我只是回到了java編程),而不是像我在這裏所做的那樣使其成爲靜態的。 – marchemike 2015-02-06 05:29:46

1

我認爲暴跌是因爲NullPointerException異常的。這是因爲你太早調用findViewById。通常,我們在調用Activity.setContentView 之後使用findViewById。 看到:enter link description here

+0

我沒有檢查我使用的代碼,而且沒有我調用的3個字符串似乎沒問題。我還在問題中添加了類的代碼。 – marchemike 2015-02-06 03:59:29

2

改變這個代碼ReservationProcessActivity:

UnitCode = ReservationActivity.UnitCode.toString(); 
    RDate = ReservationActivity.RDate.toString(); 
    Area = ReservationActivity.AArea.toString(); 

到:

UnitCode = ReservationActivity.UnitCode; 
    RDate = ReservationActivity.RDate; 
    Area = ReservationActivity.AArea; 
1

我會用getter和setter的情況下,如果您正在使用全局變量玩建議你。如果我是你,我會爲全局變量設置一個單獨的類。

例如,有一個名爲ReservationData的單獨類。

public class ReservationData { 

public static String UnitCode; 
public static String RDate; 
public static String AArea; 

public static String getUnitCode() { 
    return UnitCode; 
} 

public static void setUnitCode(String unitCode) { 
    UnitCode = unitCode; 
} 

public static String getRDate() { 
    return RDate; 
} 

public static void setRDate(String RDate) { 
    ReservationData.RDate = RDate; 
} 

public static String getAArea() { 
    return AArea; 
} 

public static void setAArea(String AArea) { 
    ReservationData.AArea = AArea; 
} 

}

從活動,調用setter方法。

公共類ReservationActivity延伸活動{

public static String UnitCode; 
public static String RDate; 
public static String AArea; 

@Override 
protected void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.reservation_activity); 

    //button 
    final Button nextButton = (Button) findViewById(R.id.NextButton1); 

    //textbox 
    final EditText unitCode = (EditText) findViewById(R.id.editText1); 
    final EditText reservationDate = (EditText) findViewById(R.id.editText2); 
    final EditText Area = (EditText) findViewById(R.id.editText3); 

    nextButton.setOnClickListener(new View.OnClickListener(){ 

     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      UnitCode = unitCode.getText().toString(); 
      RDate = reservationDate.getText().toString(); 
      AArea = Area.getText().toString();        

////呼叫setter方法

  ReservationData.setAArea(AArea); 
      ReservationData.setRDate(RDate); 
      ReservationData.setUnitCode(UnitCode); 

////呼叫setter方法

  Intent i = new Intent(ReservationActivity.this, ReservationProcessActivity.class); 
      startActivity(i); 
      finish(); 
     } 

    }); 

}

在那裏servservProcessActivity類從ReservationData調用getter方法。

,而不是下面的代碼,

UnitCode = ReservationActivity.UnitCode.toString(); 
    RDate = ReservationActivity.RDate.toString(); 
    Area = ReservationActivity.AArea.toString(); 

利用這些,

  Area = ReservationData.setAArea(AArea); 
      RDate = ReservationData.setRDate(RDate); 
      UnitCode = ReservationData.setUnitCode(UnitCode);