2016-10-10 8 views
-3
public class Page3 extends Activity { 
double latitude; 
double longitude; 

/** 
* Called when the activity is first created. 
*/ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.page3); 
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() 
      .permitAll().build(); 
    StrictMode.setThreadPolicy(policy); 
    /* Use the LocationManager class to obtain GPS locations */ 
    LocationManager mlocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 

    LocationListener mlocListener = new MyLocationListener(); 
    try { 
     mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener); 
    } catch (SecurityException e) { 
     e.printStackTrace(); 
    } 
} 

/* Class My Location Listener */ 
public class MyLocationListener implements LocationListener { 
    @Override 
    public void onLocationChanged(Location loc) { 

     double a = loc.getLatitude(); 
     latitude=a; 

     double b = loc.getLongitude(); 
     longitude=b; 
     String Text = "My current location is: " + 
       "Latitud = " + loc.getLatitude() + 
       "Longitud = " + loc.getLongitude(); 


     String x = getCompleteAddressString(a, b); 
     TextView text = (TextView) findViewById(R.id.tv_address); 
     text.setText(x); 
    } 

Теперь я хочу, чтобы получить доступ к переменной широте и долготы в другом class.Here являются класс, где мне нужно, чтобы получить доступ к этим variables.Please примечания: Значения latitiude и долгота установлены должным образом в этой функции, так как я получаю свое текущее местоположение (я не вставляю весь код здесь, так как это бессмысленно делать) Вот код, который я написал в классе, где я хочу получить доступ к этим переменнымAcessing переменных одного класса от другого

public class Page2 extends Activity { 
/** 
* ATTENTION: This was auto-generated to implement the App Indexing API. 
* See https://g.co/AppIndexing/AndroidStudio for more information. 
*/ 
private GoogleApiClient client; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.page2); 
    Button btn = (Button) findViewById(R.id.help); 
    Page3 a=new Page3(); 
    final double lati=a.latitude; 
    double longi=a.longitude; 
    btn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      sendSMS("9740641023", "Help"+lati+""); 
     } 
    }); 
    // ATTENTION: This was auto-generated to implement the App Indexing API. 
    // See https://g.co/AppIndexing/AndroidStudio for more information. 
    client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build(); 
} 

Опять же, я не копировал весь код. Этот код работал отлично сам по себе, но теперь при изменении он отправляет сообщение «Help0.0» alth по мнению меня, значение широты должно было измениться на мое текущее местоположение. Пожалуйста, помогите мне.

+1

Подсказка: используя имена переменных, например a или b, возможно, вы сэкономите 5 секунд для ввода; но для каждого читателя требуется минут и минут, чтобы понять, что они означают. Другими словами: используйте ** значащие ** имена. **Всегда**. – GhostCat

+0

Насколько я могу читать из показанных фрагментов, вы создаете новый 'Page3', но тогда его' Object.property' a не готов к использованию, и вы его используете. У вашего 'MyLocationListener' не было времени, чтобы обновить правильную переменную. Либо сохраните значение, используйте Singleton, чтобы удерживать правильное значение, либо используйте его только при его готовности. – Bonatti

+0

@GhostCat Будет держать это в разуме в следующий раз. –

ответ

1

Ваша проблема заключается в основном, что экземпляр один создается в метод:

LocationListener mLocListener = new MyLocationListener(); 

Вместо этого, вы должны сделать это поле этого класса.

И, если вы сделаете что общественное статическое поле, то другие классы могут получить доступ к нему с помощью

LocationListener theListner = Classname.mLocListener; 

Но это просто очень «грубой силы способ» делать вещи. Таким образом, вы можете использовать это, чтобы увидеть, можете ли вы добиться прогресса оттуда; но дело в том, что прямой доступ к статическим полям из других классов - это плохая практика; и вам следует избегать этого.

Как настоящий урок: это очень базовое «знание java». На данный момент вы должны отступить от «android»; и изучают эти основные вещи Java (например: «какие разумные способы доступа к информации в других объектах»). В противном случае вы ударяете одну стену за другой!

И тогда, когда вы понимаете эти основы; чем вы смотрите на good книги/учебники об Android, которые объясняют вам, как работает «мир Android». Потому что Android иногда использует очень специальные способы, чтобы добиться результата.

+0

Если я сделаю LocationListener общедоступным в природе, тогда мне придется изменить все методы, чтобы быть статическими тоже .. Это то, что вы пытаетесь сказать? –

+0

Конечно ** нет **. Вы можете получить доступ к ** статическим ** полям из статических и «обычных» методов, но не наоборот! И спасибо за основополагающую точку зрения: вы должны действительно ** изучить ** такие вещи, прежде чем пытаться писать программы. В противном случае вы перейдете от одной проблемы к следующей! – GhostCat

+0

Ofcoourse Я знаю, что. Я думал, что вы хотите сделать класс locationListener статическим, и если бы я это сделал, поскольку статический класс может обращаться только к статическим методам, мне пришлось бы сделать все остальные методы статическими. Спасибо в любом случае –

0

Объявите, что variavle, как public static double lattitiue в First.java классе

и теперь вы можете получить значение этой переменной в любом классе, используя First.lattitude

0

Хорошие данные Абстракция и инкапсуляция позволяет клиентам класса только видеть что класс позволяет клиенту (-ам) видеть. Ваши данные, такие как ваши переменные, широта и долгота в классе Page3, не должны быть доступны непосредственно другому классу. У вас должны быть общедоступные методы getter (accessor) и setter (mutator), которые ограничивают доступ к вашим членам данных, которые должны быть объявлены как закрытые.

Вы можете наследовать один класс только на Java, но вы можете реализовать столько интерфейсов, сколько хотите. Таким образом, вам не нужен внутренний публичный класс MyLocationListener в классе Page3. Просто используйте ключевое слово реализации и переопределите методы интерфейса.

public class Page3 extends Activity implements LocationListener { // implement the interface instead of creating an inner class 
    private double latitude; // hide your data members from the client 
    private double longitude; 

/** 
* Called when the activity is first created. 
*/ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.page3); 
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() 
     .permitAll().build(); 
    StrictMode.setThreadPolicy(policy); 
    /* Use the LocationManager class to obtain GPS locations */ 
    LocationManager mlocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 

try { 
    mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); // pass in this referring to the current class since implementing the interface LocationListener 
} catch (SecurityException e) { 
    e.printStackTrace(); 
} 

@Override 
public void onLocationChanged(Location loc) { 

    setMyLatitude(loc.getLatitude()); // use mutator method to change value of your private data member 
    setMyLongitude(loc.getLongitude()); // use mutator method to change value of your private data member 
    String Text = "My current location is: " + 
      "Latitud = " + loc.getLatitude() + 
      "Longitud = " + loc.getLongitude(); 


    String x = getCompleteAddressString(a, b); 
    TextView text = (TextView) findViewById(R.id.tv_address); 
    text.setText(x); 
} 

public void setMyLatitude(double a) { 
    this.latitude = a; 
} 

public void setMyLongitude(double b) { 
    this.longitude = b; 
} 

public double getMyLatitude() { 
    return latitude; 
} 

public double getMyLongitude() { 
    return longitude; 
} 
} 

Теперь используйте свои общедоступные методы для доступа к своим членам данных во втором действии.

public class Page2 extends Activity { 
/** 
* ATTENTION: This was auto-generated to implement the App Indexing API. 
* See https://g.co/AppIndexing/AndroidStudio for more information. 
*/ 
private GoogleApiClient client; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.page2); 
    Button btn = (Button) findViewById(R.id.help); 
    Page3 a=new Page3(); 
    final double lati=a.getMyLatitude(); 
    double longi=a.getMyLongitude(); 
    btn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      sendSMS("9740641023", "Help"+lati+""); 
     } 
    }); 
    // ATTENTION: This was auto-generated to implement the App Indexing API. 
    // See https://g.co/AppIndexing/AndroidStudio for more information. 
    client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build(); 

}

То есть для хорошей практики программирования. Слушатель для связи между двумя действиями, вероятно, вам не нужно, чтобы получить инициализированное двойное значение 0.0. Слушатель должен быть реализован в классе Page2 с элементом данных, который установлен на слушателя в Page2 в классе Page3. У слушателя будет некоторый метод (ы), чтобы либо передать нужные данные, либо сообщить классу Page 2, что информация была каким-то образом изменена.

public class Page2 extends Activity implements DataListener { 
....... 
@Override 
public void someMethod() { 
    // do something with the data longitude and latitude as their values have changed 
} 
private GoogleApiClient client; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.page2); 
    Button btn = (Button) findViewById(R.id.help); 
    Page3 a=new Page3(); 
    a.setDataListener(this); // pass listener to the other class 
/* code in Page2 */ 
} 

public class Page3 extends Activity implements LocationListener { 
private DataListener myListener; 
/* code in Page3 */ 

@Override 
public void onLocationChanged(Location loc) { 

    setMyLatitude(loc.getLatitude()); // use mutator method to change value of your private data member 
    setMyLongitude(loc.getLongitude()); // use mutator method to change value of your private data member 
    myListener.someMethod(); // call this method to inform the other class that information has changed 
String Text = "My current location is: " + 
     "Latitud = " + loc.getLatitude() + 
     "Longitud = " + loc.getLongitude(); 


String x = getCompleteAddressString(a, b); 
TextView text = (TextView) findViewById(R.id.tv_address); 
text.setText(x); 
} 

public void setDataListener(DataListener listener) { 
    this.myListener = listener; 
} 

Вы также можете передать в долготе и широте непосредственно в «DataListener» метод «SomeMethod» в Страница3 и даже не нужны добытчиками и сеттеров и частные элементы данных класса PAGE3.

Смежные вопросы