2015-02-06 50 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);