Android – получить переменную из oncreate() другого класса

У меня есть класс GetMyLocation, который получает текущее местоположение пользователя. Теперь я пытаюсь вызвать объект этого класса из другого класса, ShowMap2. Но я не могу отправить обновленное местоположение в новый класс.

Я не включил здесь другие переопределения для GetMyLocation.

Что я имею:

public class ShowMap2 extends Activity{
        @Override
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_showmap);

        GetMyLocation myLocation = new GetMyLocation();


        myLat = myLocation.GetCurrentLat();
        myLon = myLocation.GetCurrentLon();

   }

Это класс, который получает местоположение:

public class GetMyLocation extends Activity implements LocationListener {


    protected LocationManager locationManager;
    protected LocationListener locationListener;
    Location location;

    public static double myLat, myLon;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);

        location = locationManager.getLastKnownLocation(locationManager.GPS_PROVIDER);


       this.myLat = location.getLatitude();
       this.myLon = location.getLongitude();

    }


    public double GetCurrentLat(){
        return this.myLat;
    }

    public double GetCurrentLon(){
        return this.myLon;
    }

Приведенный выше код возвращает 0,0 для широты и долготы.

Я пробовал все возможные способы, которые только мог придумать, но всегда получаю 0.0. Я знаю, что сам класс получает мои текущие широту и долготу, но я не могу правильно его передать. Не могли бы некоторые, пожалуйста, помочь мне здесь?

Спасибо.

PS:

Я нашел эту ветку и попробовал ее соответственно, но безрезультатно. Еще нули.

Как получить доступ к этой переменной из метода Android onCreate?< /а>

Единственное отличие, в вопросе по ссылке класс статический. Когда я делаю свой класс статическим, он говорит: Модификатор «статический» здесь не разрешен.

Мой обновленный код:

public class GetMyLocation extends Activity implements LocationListener {

    protected LocationManager locationManager;
    protected LocationListener locationListener;
    Location location;

    static double myLat, myLon;

    double GetCurrentLat(){
        return myLat;
    }

    double GetCurrentLon(){
        return myLon;
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);

        location = locationManager.getLastKnownLocation(locationManager.GPS_PROVIDER);

        this.myLat = location.getLongitude();
        this.myLon = location.getLongitude();

    }

РЕДАКТИРОВАТЬ: обновленный код, который работает:

public class GetMyLocation implements LocationListener {
//public class GetMyLocation extends Activity implements LocationListener {

    private static final LatLng HAMBURG = new LatLng(43.48484521,-80.5274279);
    private GoogleMap map;

    protected LocationManager locationManager;
    protected LocationListener locationListener;
    Location location;

    private static double myLat, myLon;

    GetMyLocation(Activity activity){

        locationManager = (LocationManager) activity.getSystemService(Context.LOCATION_SERVICE);
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);

        location = locationManager.getLastKnownLocation(locationManager.GPS_PROVIDER);

        this.myLat = location.getLatitude();
        this.myLon = location.getLongitude();

    }

    double GetCurrentLat(){
        return this.myLat;
    }

    double GetCurrentLon(){
        return this.myLon;
    }

получение значений местоположения из ShowMap2 с помощью:

GetMyLocation myLocation = new GetMyLocation(this);

person fractal5    schedule 27.02.2015    source источник
comment
Вы отправляли переменные через намерение во secondActivity?   -  person KOTIOS    schedule 27.02.2015
comment
просто создание экземпляра класса GetMyLocation myLocation = new GetMyLocation(); не вызывает для него методы `onCreate(Bundle saveInstanceState);' Вам нужно научиться создавать новую активность   -  person Scary Wombat    schedule 27.02.2015


Ответы (2)


Вы расширяете Activity в GetMyLocation. Для достижения желаемой цели удалите extends Activity и переместите код из onCreate() в подходящий конструктор, например GetMyLocation().

В остальном ваша логика верна.

Активность предназначена для графического интерфейса, и если вы не собираетесь открывать новую активность в своем классе, не расширяйте Activity. Чтобы код работал из onCreate(), вам нужно создать намерение вашего класса и запустить действие, которое откроет пустое действие, потому что вы не устанавливаете никаких представлений в GetMyLocation.

С точки зрения непрофессионала, ваш onCreate() никогда не вызывается, потому что вы никогда не начинаете деятельность.

EDIT Чтобы передать Context нашему классу, чтобы он работал правильно, мы определим наш конструктор следующим образом:

GetMyLocation(Context context) {
    locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);

    location = locationManager.getLastKnownLocation(locationManager.GPS_PROVIDER);

    this.myLat = location.getLatitude();
    this.myLon = location.getLongitude();

}

И мы инициализируем наш класс так: GetMyLocation location = new GetMyLocation(this); из вашего Activity. Когда мы ссылаемся на this из нашего класса, он указывает на этот класс, который, как оказалось, является Activity, удовлетворяющим нашему конструктору GetMyLocation(Context context). Затем вы можете вызывать свои методы и получать ожидаемые результаты.

Когда вы первоначально назвали getSystemService(), вы подразумевали this, что было ссылкой на вашу деятельность, которая никогда не начиналась. Вот почему ваша IDE разозлилась на вас, когда вы удалили extends Activity из GetMyLocation(). Он не знал, где искать getSystemService(), потому что подразумеваемый класс this больше не был Context.

person MeetTitan    schedule 27.02.2015
comment
Если я удалю действие расширения, он не сможет разрешить getSystemService. Также я ранее переместил код из onCreate() в конструктор. Но это заставит приложение закрыться/вылететь, когда я его запустил. - person fractal5; 27.02.2015
comment
Затем вы должны передать Context в качестве параметра в свой конструктор. Я добавлю пример фрагмента к моему ответу. - person MeetTitan; 27.02.2015
comment
Это хорошо работает, спасибо. Только один вопрос, какой контекст я должен передать из моего класса ShowMap2. Это мое первое приложение на Java, поэтому я немного растерялся. - person fractal5; 27.02.2015
comment
@ fractal5, Context - это то, что расширяет Activity, а getSystemService() - это метод Context. Вы можете заменить Context на Activity, и в вашем экземпляре он будет работать точно так же без ошибок. Каждый Activity является Context, но каждый Context не является Activity. Также как каждая кошка — животное, но каждое животное — не кошка. Если эта концепция не имеет смысла, погуглите о наследовании Java и взгляните на некоторую документацию. О, и если вы чувствуете, что я помог вам, не стесняйтесь голосовать или принимать ответ. - person MeetTitan; 27.02.2015
comment
@ fractal5, также подумайте о том, что животные едят. Все животные едят, но не все животные обязательно едят одно и то же или одинаково. Это похоже на унаследованные методы. - person MeetTitan; 27.02.2015
comment
Большое спасибо, это действительно помогло. Я посмотрю контекст и наследование, и, надеюсь, это решит проблему. К сожалению, я не могу проголосовать, так как у меня нет 15 повторений. Ответ принят! - person fractal5; 27.02.2015
comment
Маленькая галочка слева от моего ответа ;). Эй, нет проблем. Суть этого сайта в том, что мы ВСЕ там были. Мы здесь, чтобы помочь. Я также хотел бы отметить, что единственная причина, по которой Activity будет работать вместо Context, заключается в том, что ваш Context является Activity. Переключите это, скажем, на Service , и это не сработает. - person MeetTitan; 27.02.2015
comment
Это сработало! Благодаря тонну! Обновлен код, размещенный в исходном вопросе для будущих ссылок. - person fractal5; 27.02.2015
comment
@ fractal5, очень мило. Могу ли я предложить реализовать метод refreshLocation() в вашем классе GetMyLocation. Метод может просто вызвать location = getLastKnownLocation(..);, как это делаете вы, но последующие вызовы GetCurrentLon() и GetCurrentLat() будут отражать самое последнее местоположение. Также известно ли вам, что вы устанавливаете myLat И myLon ОБА на location.getLongitude()? - person MeetTitan; 27.02.2015
comment
Ха-ха-ха, я заметил это после того, как несколько раз оказался в Антарктиде. Я думаю, что есть такой метод, как метод refreshLocation, однако я изначально отключил его при отладке приложения. Спасибо за предложение. - person fractal5; 28.02.2015

Если вы хотите передать параметры из Activity в Activity, используйте Bundle. Если вы хотите получить результат при выходе Activity, используйте startActivityForRestult при создании нового Activity. Если вы просто хотите передать параметры из Activity в другой класс, используйте конструктор класса.

person Bob    schedule 27.02.2015