android студия получает строковое значение из другого метода - PullRequest
0 голосов
/ 20 июня 2020

У меня есть метод getLastLocation (), который содержит две строки city и country, проблема в том, когда Я пытаюсь установить для строки textview вне метода, у которого я получаю пустое значение, это работает только тогда, когда я устанавливаю строку на textview внутри метода,

любая помощь будет оценена.

здесь это мой код:

getLastLocation ();

String city;
String country;

Textview cityText = (TextView) findViewById(R.id.tv_city);
Textview countryText = (TextView) findViewById(R.id.tv_country);

    cityText .setText(country);
    countryText .setText(city);


        @SuppressLint("MissingPermission")
    public void getLastLocation(){
        if (checkPermissions()) {
            if (isLocationEnabled()) {
                mFusedLocationClient.getLastLocation().addOnCompleteListener(
                        new OnCompleteListener<Location>() {
                            @Override
                            public void onComplete(@NonNull Task<Location> task) {
                                Location location = task.getResult();
                                if (location == null) {
                                    requestNewLocationData();
                                } else {

                                    MyLat = location.getLatitude();
                                    MyLong = location.getLongitude();


                                    LocationManager lm = (LocationManager)getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
                                    Geocoder geocoder = new Geocoder(getApplicationContext());
                                    for(String provider: lm.getAllProviders()) {
                                        @SuppressWarnings("ResourceType") Location location1 = lm.getLastKnownLocation(provider);
                                        if(location!=null) {
                                            try {
                                                List<Address> addresses = geocoder.getFromLocation(location1.getLatitude(), location1.getLongitude(), 1);
                                                if(addresses != null && addresses.size() > 0) {


         city = addresses.get(0).getCountryName();  ///////string I want to get <<<---------
         country =  addresses.get(0).getLocality(); ///////string I want to get <<<---------

                                                    break;
                                                }
                                            } catch (IOException e) {
                                                e.printStackTrace();
                                            }
                                        }
                                    }

                                }
                            }
                        }
                );
            } else {
                Toast.makeText(this, "Turn on location", Toast.LENGTH_LONG).show();
                Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                startActivity(intent);
            }
        } else {
            requestPermissions();
        }
    }

Ответы [ 2 ]

0 голосов
/ 20 июня 2020
 mFusedLocationClient.getLastLocation().addOnCompleteListener(
                    new OnCompleteListener<Location>() {}

В вашем коде есть слушатель. Даже если вы поместите сначала getLastLocation (), нет гарантии, что строки города и страны будут иметь присвоенное значение.

 public void onComplete(@NonNull Task<Location> task) 

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

Любой код, который вы написали ниже, getLastLocation () будет выполняться без обязательного запуска onCompleted ().

Таким образом, вы получаете null вместо фактического значения в textViews.

Чтобы этого избежать, вы необходимо обновить текстовые представления внутри метода OnComplete ().

Если вы все еще хотите обновить выход текстовых представлений из getLastLocation (), добавьте задержку для установки значения textView

Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            cityText .setText(country);
            countryText .setText(city);
        }
    },5000); //textviews will be set value after 5 seconds, assuming that OnComplete() inside getLastLocation() will be triggered within 5 seconds.
0 голосов
/ 20 июня 2020

В соответствии с тем, что я получил из вашего вопроса, вы устанавливаете строковое значение для textview перед вызовом функции getLastLocation (), и тогда ваша строка (город и страна) пуста или пуста;

сначала вы нужно будет вызвать метод, а затем установить его на texview, это будет работать нормально.

getLastLocation() ;

cityText .setText(country);
countryText .setText(city);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...