【问题标题】:Cannot resolve symbol "locationListener" - Android无法解析符号“locationListener” - Android
【发布时间】:2019-10-08 14:52:33
【问题描述】:

我在实现 LocationListener 时遇到问题。

import androidx.appcompat.app.AppCompatActivity;

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Address;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView;
import java.io.IOException;
import java.util.List;
import java.util.Locale;

public class MainActivity extends AppCompatActivity {
    TextView latitudeTV;
    TextView longitudeTV;
    TextView altitudeTV;
    TextView locationNameTV;
    double latitude;
    double longitude;
    double altitude;
    String locationName;

    LocationManager locationManager;
    Location location;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        latitudeTV = (TextView) findViewById(R.id.latitude);
        longitudeTV = (TextView) findViewById(R.id.longitude);
        altitudeTV = (TextView) findViewById(R.id.altitude);
        locationNameTV = (TextView) findViewById(R.id.locationName);

        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }

        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 0, locationListener);

        location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

        onLocationChanged(location);

        LocationListener locationListener = new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {
                longitude = location.getLongitude();
                latitude = location.getLatitude();
                altitude = location.getAltitude();
                locationName = "Placeholder";

                longitudeTV.setText("Longitude: \n" + longitude + "°");
                latitudeTV.setText("Latitude: \n" + latitude + "°");
                altitudeTV.setText("Altitude: \n" + altitude + "m");
                locationNameTV.setText("Location: \n" + locationName);
            }

            @Override
            public void onStatusChanged(String s, int i, Bundle bundle) {

            }

            @Override
            public void onProviderEnabled(String s) {

            }

            @Override
            public void onProviderDisabled(String s) {

            }
        };
    }
}

我不确定这是语法问题还是范围问题,但我不断收到“无法解析符号”错误。这就像我没有实现 LocationListener 方法一样。我尝试将implements LocationListener 添加到MainActivity 并显示一个错误,说我没有实现LocationListener 方法。我不确定我的错误在哪里。

编辑:

我已根据您的回答更改了我的代码。当我尝试实现//locationManager.requestLocationUpdates(Context.LOCATION_SERVICE, 5000, 0, this); 时,我在尝试启动应用程序时得到以下信息:LocationTestApp keeps stopping。我已注释掉该行,该应用程序再次运行。

public class MainActivity extends AppCompatActivity implements LocationListener {

    TextView latitudeTV;
    TextView longitudeTV;
    TextView altitudeTV;
    double latitude;
    double longitude;
    double altitude;

    LocationManager locationManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        latitudeTV = (TextView) findViewById(R.id.latitude);
        longitudeTV = (TextView) findViewById(R.id.longitude);
        altitudeTV = (TextView) findViewById(R.id.altitude);

        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }

        //locationManager.requestLocationUpdates(Context.LOCATION_SERVICE, 5000, 0, this);

        Location location = locationManager.getLastKnownLocation(locationManager.NETWORK_PROVIDER);

        onLocationChanged(location);

    }

    @Override
    public void onLocationChanged(Location location) {
        longitude = location.getLongitude();
        latitude = location.getLatitude();
        altitude = location.getAltitude();

        longitudeTV.setText("Longitude: \n" + longitude + "°");
        latitudeTV.setText("Latitude: \n" + latitude + "°");
        altitudeTV.setText("Altitude: \n" + altitude + "m");
    }

    @Override
    public void onStatusChanged(String s, int i, Bundle bundle) {

    }

    @Override
    public void onProviderEnabled(String s) {

    }

    @Override
    public void onProviderDisabled(String s) {

    }
}

【问题讨论】:

  • 实现接口时,需要实现方法。再次将其添加为 MainActivity 的接口,然后自动生成方法。
  • 像这样修改您的行:public class MainActivity extends AppCompatActivity implements LocationListener 并单击该行。然后按 Alt+Enter 并转到“实现方法”。添加它们,然后你不应该因为没有实现它们而出错。

标签: android location locationlistener


【解决方案1】:

LocationListener 类,在本例中为 Activity,应定义如下:

import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;

public class MainActivity extends AppCompatActivity implements LocationListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ...
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 0, this);  // Note: You pass this, so the overridden methods
    }

    @Override
    public void onLocationChanged(Location location) {
        // Do your stuff here
    }


    @Override
    public void onProviderDisabled(String provider) {}

    @Override
    public void onProviderEnabled(String provider) {}

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {}
}

这就是 jle 的 cmets 中的解决方案。

但是如果你想使用你在onCreate中声明的locationListener,你应该在使用它之前声明它,这样:

...onCreate(...) {
    ...
    LocationListener locationListener = new LocationListener() {...} // Define this...

    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 0, locationListener);   // ...and then call this

    location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

    onLocationChanged(location); 
}

【讨论】:

  • 我已经根据您的回答编辑了我的代码,现在我的应用程序在启动时崩溃了。有关代码,请参阅我编辑的问题。
  • 请检查您的 logcat 中的错误,“LocationTestApp 不断停止”应该有一个动机,在您的 Logcat 中写有“Caused by ...”之类的内容
  • 谢谢,我的requestLocationUpdates 通话中似乎缺少该提供商。我改为添加了这些代码行 Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); String provider = locationManager.getBestProvider(criteria, true); 现在当我使用 locationManager.requestLocationUpdates(provider, 5000, 0, this); 调用更新时,它的工作方式与预期完全一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-03
  • 1970-01-01
  • 2016-06-15
  • 2017-02-09
  • 2015-12-28
  • 2016-03-03
  • 1970-01-01
相关资源
最近更新 更多