从另一个方法访问变量

我正在尝试使用当前位置在android中提交用户注册表单。 我是android和java开发的新手。 当我尝试在我的名称值对代码中访问onLocationChanged方法的myLat和myLan时,它无法找到这两个变量。 如何访问我的名称值对代码中的变量。

package com.imran; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; 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 com.google.android.gcm.GCMRegistrar; import com.google.android.maps.MyLocationOverlay; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.os.StrictMode; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import android.app.Activity; import android.content.Context; public class Register extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_register); final EditText email_id = (EditText) findViewById(R.id.email_id) ; final EditText name = (EditText) findViewById(R.id.name); final EditText password = (EditText) findViewById(R.id.password); Button button = (Button) findViewById(R.id.button1) ; //generate GCM id GCMRegistrar.checkDevice(this); GCMRegistrar.checkManifest(this); final String regId = GCMRegistrar.getRegistrationId(this); if (regId.equals("")) { GCMRegistrar.register(this, "12356"); } else { String TAG = null; Log.v(TAG, regId); } //generate GCM id ended StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); //get current location LocationManager manager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); LocationListener listner = new LocationListener() { @Override public void onStatusChanged(String arg0, int arg1, Bundle arg2) { // TODO Auto-generated method stub } @Override public void onProviderEnabled(String arg0) { // TODO Auto-generated method stub } @Override public void onProviderDisabled(String arg0) { // TODO Auto-generated method stub } @Override public void onLocationChanged(Location location) { double myLonDouble = location.getLongitude(); final String myLon = Double.toString(myLonDouble); double myLatDouble = location.getLatitude(); final String myLat = Double.toString(myLatDouble); } }; manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listner); //end get current location button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub //postData(); HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("http://xyz.com/folder/register.php"); try { // Add your data List nameValuePairs = new ArrayList(2); nameValuePairs.add(new BasicNameValuePair("email", email_id.getText().toString())); nameValuePairs.add(new BasicNameValuePair("name", name.getText().toString())); nameValuePairs.add(new BasicNameValuePair("password", password.getText().toString())); nameValuePairs.add(new BasicNameValuePair("regid", regId)); nameValuePairs.add(new BasicNameValuePair("uid", "2")); nameValuePairs.add(new BasicNameValuePair("lat",myLat )); nameValuePairs.add(new BasicNameValuePair("lon",myLon)); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); // Execute HTTP Post Request //Toast.makeText(this, resId, duration) HttpResponse response = httpclient.execute(httppost); } catch (ClientProtocolException e) { // TODO Auto-generated catch block } catch (IOException e) { // TODO Auto-generated catch block } } }); } } 

您应该研究范围和成员变量 。 问题是,你不能在一个方法中声明一件事然后尝试从另一个方法访问它。

因此,我们将该事物声明为成员变量,并在一个方法中定义它,然后它可以在另一个方法中使用。

像这样(我用**标记了我的评论):

 public class Register extends Activity { // "private" means it can only be accessed from this class private String myLat = null; // ** Declare myLat private String myLon = null; // ** Declare myLon @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_register); final EditText email_id = (EditText) findViewById(R.id.email_id) ; final EditText name = (EditText) findViewById(R.id.name); final EditText password = (EditText) findViewById(R.id.password); Button button = (Button) findViewById(R.id.button1) ; //generate GCM id GCMRegistrar.checkDevice(this); GCMRegistrar.checkManifest(this); final String regId = GCMRegistrar.getRegistrationId(this); if (regId.equals("")) { GCMRegistrar.register(this, "12356"); } else { String TAG = null; Log.v(TAG, regId); } //generate GCM id ended StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); //get current location LocationManager manager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); LocationListener listner = new LocationListener() { @Override public void onStatusChanged(String arg0, int arg1, Bundle arg2) { // TODO Auto-generated method stub } @Override public void onProviderEnabled(String arg0) { // TODO Auto-generated method stub } @Override public void onProviderDisabled(String arg0) { // TODO Auto-generated method stub } @Override public void onLocationChanged(Location location) { double myLonDouble = location.getLongitude(); myLon = Double.toString(myLonDouble); // ** Define myLon double myLatDouble = location.getLatitude(); myLat = Double.toString(myLatDouble); // ** Define myLat } }; manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listner); //end get current location button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub // ** Check if they have been defined if (myLat == null || myLon == null) return; //postData(); HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("http://xyz.com/folder/register.php"); try { // Add your data List nameValuePairs = new ArrayList(2); nameValuePairs.add(new BasicNameValuePair("email", email_id.getText().toString())); nameValuePairs.add(new BasicNameValuePair("name", name.getText().toString())); nameValuePairs.add(new BasicNameValuePair("password", password.getText().toString())); nameValuePairs.add(new BasicNameValuePair("regid", regId)); nameValuePairs.add(new BasicNameValuePair("uid", "2")); nameValuePairs.add(new BasicNameValuePair("lat",myLat )); nameValuePairs.add(new BasicNameValuePair("lon",myLon)); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); // Execute HTTP Post Request //Toast.makeText(this, resId, duration) HttpResponse response = httpclient.execute(httppost); } catch (ClientProtocolException e) { // TODO Auto-generated catch block } catch (IOException e) { // TODO Auto-generated catch block } } }); } } 

您的变量范围存在问题。 您正在初始化的myLatDouble和myLon Double仅存在于创建它们的onLocationChanged方法中。 您必须在不同的位置声明它们,以便在您尝试访问它们时它们不会超出范围,或者您必须将它们作为参数传递给nameValuePairs代码