2016-08-28 20 views
0

別のクラスから値を取得したいが、2番目のクラスで値を取得するとnullになる。私はそれがコードが実行されないこの文字列に何かが追加されたときにbcsが発生すると思います。別のクラスから値を取得

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_maps); 
    // Obtain the SupportMapFragment and get notified when the map is ready to be used. 
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
      .findFragmentById(R.id.map); 
    mapFragment.getMapAsync(this); 

多くの重要なコード..................................... ..

FirebaseDatabase database5 = FirebaseDatabase.getInstance(); 
    DatabaseReference myRef5 = database5.getReference("userdata"); 

    myRef5.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      // This method is called once with the initial value and again 
      // whenever data at this location is updated. 

ロットのないコード.................................... .........

mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { 
        @Override 
        public boolean onMarkerClick(final Marker marker) { 

多くの重要なコード............................ ...............

new CountDownTimer(2000, 1000) { 

      public void onTick(long millisUntilFinished) { 

      } 
      public void onFinish() { 

       progressBar.setVisibility(View.GONE); 
       textViewPleaseWait.setVisibility(View.INVISIBLE); 

       recipientEmail = marker.getTitle(); 
       Log.i("omg", recipientEmail); 

       dialogBuilder.setMessage("Username: " + usernameAlert + "\n" + "Gender: " + genderAlert 
             + "\n" + "Age: " + ageAlert + "\n" + marker.getSnippet() + "\n" + marker.getTitle()); 

       dialogBuilder.setPositiveButton("Send message", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface arg0, int arg1) { 
         Intent intent = new Intent(getApplicationContext(), SendMessage.class); 
         startActivity(intent); 

         recipientEmail = marker.getTitle(); 
        } 
       }); 

       dialogBuilder.setNegativeButton("Close", null); 
       dialogBuilder.show(); 


      } 
     }.start(); 

}

ここでは....私はtimerが完了したらrecipientEmailに値を設定しますが、マップ上のマーカーをクリックしてタイマーを実行する必要があります。私はこのタイマーbcsの値の外に値のrecipientEmailを設定することはできません同じではありません。だから私は、通常、別のクラスでそれを呼び出すとき:

MapsActivity mapsActivity = new MapsActivity(); 

    recipientUsername2 = mapsActivity.getRecipientEmail(); 
    Log.i("values2", mapsActivity.recipientEmail); 

そして、第2の活性アプリのクラッシュを実行した後。

08-28 21:34:25.943 4609-4609/com.samo.facedatefb E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.samo.facedatefb, PID: 4609 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.samo.facedatefb/com.samo.facedatefb.SendMessage}: java.lang.NullPointerException: println needs a message 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2464) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2526) 
    at android.app.ActivityThread.access$800(ActivityThread.java:169) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421) 
    at android.os.Handler.dispatchMessage(Handler.java:111) 
    at android.os.Looper.loop(Looper.java:194) 
    at android.app.ActivityThread.main(ActivityThread.java:5549) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:964) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:759) 
Caused by: java.lang.NullPointerException: println needs a message 
    at android.util.Log.println_native(Native Method) 
    at android.util.Log.i(Log.java:160) 
    at com.samo.facedatefb.SendMessage.onCreate(SendMessage.java:79) 
    at android.app.Activity.performCreate(Activity.java:5975) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1111) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2417) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2526)  
    at android.app.ActivityThread.access$800(ActivityThread.java:169)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)  
    at android.os.Handler.dispatchMessage(Handler.java:111)  
    at android.os.Looper.loop(Looper.java:194)  
    at android.app.ActivityThread.main(ActivityThread.java:5549)  
    at java.lang.reflect.Method.invoke(Native Method)  
    at java.lang.reflect.Method.invoke(Method.java:372)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:964)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:759)  

お願いします。ここで

答えて

4

あなたが作成新しい、(おそらくMapsActivityインスタンス:

MapsActivity mapsActivity = new MapsActivity(); 

そして、下の2本のライン、あなたはそれから読み取ろう:

recipientUsername2 = mapsActivity.getRecipientEmail(); 

不思議それを空です。 このMapsActivityはあなたが ...を探しているMapsActivity(ちょうどこの時間は、それはジェダイのトリックではありません。)

はこのようにそれを把握してみません:あなたはMapsActivityでrecipientEmailフィールドを設定すると、次のように記述それは紙の上にある。 new MapsActivity()コンストラクタ呼び出しでは、あなたの引き出しから紙の新しい部分を取得 - 異なる 1を、そして今、あなたは、他のいずれかに書いた紙、オフ何かを読み取ろう...

ようにするにはその情報を持つことができたら、あなたはそれをどこかに置く必要があります - あなたが渡すクラスのインスタンスに設定し、次に使用する予定のクラスのフィールドに設定してください...

今回しかし、私はストリングをエクストラとしてSendMailアクティビティに設定するといいでしょう:

Intent intent = new Intent(getApplicationContext(), SendMessage.class); 
intent.putExtra("RECIPIENT_EMAIL", marker.getTitle()); 
startActivity(intent); //this has to be after the putExtra call 

そして、あなたはSendMail活動でそれにアクセスしようとすると:

String recipientEmail = null; 
Bundle extras = getIntent().getExtras(); 
if(extras == null) { 
    throw new IllegalStateException("No email address found at SendMail activity!"); 
} else { 
    recipientEmail = extras.getString("RECIPIENT_EMAIL"); 
} 

はまた、 this questionへの回答を読んで、私は通常、エクストラに対処することときに向けます。

もう一つは:オブジェクトのメンバにアクセスするための推奨方法は、プライベート、それらを設定vland ゲッターに方法および該当する場合は、セッターメソッドを追加することです。変数をアクセス可能なままにしておけば問題はあります。

+0

コードはもちろん、問題がどこにあるのかを説明してくれてありがとう、本当に感謝します。 – Samo

関連する問題