Member 13593129 Ответов: 1

Как открыть карту Google, нажав на элемент listview?


Мне нужна помощь от кого-то, кто знает, как использовать карты в Android Studio. Меня интересует, как открыть карту G., щелкнув по элементу listview из фрагмента.Это мой код.:

Это код из фрагмента:

@OnItemClick(R.id.lvTours)
    public void onItemClick(int position) {


        String tour = ((Tours) lvTours.getAdapter().getItem(position)).getCoord();//coordinats are stored on Firebase
        Intent showMap = new Intent(getContext(), MapActivity.class);
        showMap.putExtra(MapActivity.COORD, longitude);
        showMap.putExtra(MapActivity.COORD, latitude);
        showMap.putExtra(MapActivity.COORD, tour);
        startActivity(showMap);

    }


И это MapActivity:

public class MapActivity extends AppCompatActivity implements OnMapReadyCallback, LocationSource.OnLocationChangedListener {


    public static final String COORD = "coord";
    private GoogleMap.OnMapClickListener mCustomOnMapClickListener;

    private GoogleMap mGoogleMap;
    LocationManager mLocationManager;
    private Criteria mCriteria;
    private String mShowMap;


    private LocationSource.OnLocationChangedListener mListener;
    @BindView(R.id.lvTours)
    ListView lvTours;
    private SupportMapFragment mSupportMapFragment;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.tours_coord);
        this.mSupportMapFragment = (SupportMapFragment) this.getSupportFragmentManager().findFragmentById(R.id.fGoogleMap);
        this.mSupportMapFragment.getMapAsync(this);
        this.mCriteria = new Criteria();
        this.mCriteria.setAccuracy(Criteria.ACCURACY_FINE);
        this.mLocationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE);
        this.mCustomOnMapClickListener = new GoogleMap.OnMapClickListener() {
            @Override
            public void onMapClick(LatLng latLng) {
                MarkerOptions newMarkerOptions = new MarkerOptions();
                newMarkerOptions.icon(BitmapDescriptorFactory.fromResource(R.mipmap.tour));
                newMarkerOptions.title("Tour");
                newMarkerOptions.snippet("It' was here!");
                newMarkerOptions.position(latLng);
                mGoogleMap.addMarker(newMarkerOptions);

                this.handleStartingIntent();

            }

            private void handleStartingIntent() {
                Bundle bundle = getIntent().getExtras();
                if (bundle.containsKey(COORD)) {
                    mShowMap = bundle.getString(COORD);

                }


            }
        };
    }


    @Override
    public void onMapReady(GoogleMap googleMap) {
        this.mGoogleMap = googleMap;
        UiSettings uiSettings = this.mGoogleMap.getUiSettings();
        uiSettings.setZoomControlsEnabled(true);
        uiSettings.setMyLocationButtonEnabled(true);
        uiSettings.setZoomGesturesEnabled(true);
        this.mGoogleMap.setOnMapClickListener(this.mCustomOnMapClickListener);
        // goToLocation(33.835293 , -117.914505);
    }


    @Override
    public void onLocationChanged(Location location) {


        if (mListener != null) {
            mListener.onLocationChanged(location);

            //Move the camera to the user's location and zoom in!
            mGoogleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(location.getLatitude(), location.getLongitude()), 12.0f));
        }


    }


    public void goToLocation(double lat, double lng) {

        LatLng latLng = new LatLng(lat, lng);


        CameraPosition position = CameraPosition.builder()
                .target(latLng)
                .zoom(16f)
                .bearing(0.0f)
                .tilt(0.0f)
                .build();

        mGoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(position), null);


    }
}


Я был бы благодарен всем, кто дал бы мне пример того, как решить эту проблему.Спасибо.

Что я уже пробовал:

Он попытался найти решение с помощью Google.

David Crow

Что именно происходит? Создается ли исключение? Открывается ли карта, но это неправильное местоположение? Быть конкретными.

Я вижу, что вы храните широту, долготу и тур, используя один и тот же ключ. Затем, когда вы читаете этот ключ в handleStartingIntyent()- ты ничего с ним не сделаешь. Это намеренно?

Member 13593129

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

Member 13593129

Это не работает. Я получаю NP на "private double dLongitude = 0.0;" и "setContentView(R. layout.tours_coord);". Я напишу, как это выглядит сейчас.

открытый класс MapActivity расширяет FragmentActivity реализует OnMapReadyCallback {


отдельный двухместный dLatitude = 0.0;
отдельный двухместный dLongitude = 0.0;

общедоступные статические заключительные строки КООРД = "коорд";
частная строка mTours;

частная проезде через mmap;
частная проезде.OnMapClickListener mCustomOnMapClickListener;


@Ручная коррекция
protected void onCreate(Bundle savedInstanceState) {
супер.метод onCreate(savedInstanceState);
setContentView(R. layout.tours_coord);

// Получите SupportMapFragment и получите уведомление, когда карта будет готова к использованию.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R. id.fGoogleMap);
mapFragment.getMapAsync(это);

Пачка пачка = так().getExtras();
dLatitude = bundle.getDouble("широта");
dLongitude = bundle.getDouble("долгота");
если (пачке.containsKey(рук)) {
mTours = пачке.метода getString(КООРД);
}
}

@Ручная коррекция
общественного недействительными onMapReady(расчет проезде) {

вызов mmap = проезде;

LatLng latlng = новый LatLng(dLatitude, dLongitude);
mMap.addMarker(new MarkerOptions().position(latlng).title("Это было здесь"));
вызов mmap.moveCamera(CameraUpdateFactory.newLatLng(latlng с));
этот.mCustomOnMapClickListener = новый GoogleMap.OnMapClickListener() {
@Ручная коррекция
общественного недействительными onMapClick(latlng с latlng с) {
MarkerOptions newMarkerOptions = новые MarkerOptions();
newMarkerOptions.icon(BitmapDescriptorFactory.fromResource(R. mipmap.tour));
newMarkerOptions.title("тур");
newMarkerOptions.snippet("это было здесь!");
newMarkerOptions.положение(latlng с);
вызов mmap.addMarker(newMarkerOptions);


}
};
}
}



@OnItemClick(R. id.lvTours)
public void onItemClick(int position) {

Строка t = ((Tours)lvTours.getAdapter().getItem(position)).getCoord();
Intent i = новое намерение(getContext(), MapActivity.class);
i.putExtra("широта", 33.835293);
i.putExtra("долгота", -117.914505);
i.putExtra(MapActivity.Координата, Т);
startActivity(i);

}

David Crow

- Это не работает. Я получаю NP на 'private double dLongitude = 0.0;'"

Я не уверен, как это возможно, поскольку здесь нет никаких объектов. Это NullpointerException исключение выбрасывается? Как вы это проверяете?

Вызов setContentView() это нормально (опять же, никаких объектов), но что-то внутренне могло пойти наперекосяк, когда фреймворк попытался раздуть tours_coord расположение.

Member 13593129

Я вел себя как идиот. Я забыл поставить API_KEY, вот почему это не сработало. Хотя, у меня есть еще один вопрос.Это работает, но показывает только одно место.Я хочу, когда я нажимаю на каждый элемент, чтобы показать другое место. Потому что у меня 27 туров, и они были не на одном месте. У вас есть идея, как это сделать?

David Crow

В onMapReady() метод, сделайте дополнительные звонки на addMarker().

Member 13593129

Теперь все работает, кроме одного. Я сохранил свой coord(lat, lng) на Firebase, и проблема в том, что на какой бы элемент я ни нажал, он всегда открывается в одном и том же месте(Анахайм), потому что эти coord находятся здесь:

i.putExtra("широта", 33.835293);
i.putExtra("долгота", -117.914505);

Я пытался изменить это таким образом, но это не работает:

@OnItemClick(R. id.lvTours)
public void onItemClick(int position) {

Строка t = ((Tours)lvTours.getAdapter().getItem(position)).getLat();
Строка tr = ((Tours)lvTours.getAdapter().getItem(position)).getLng();
Intent i = новое намерение(getContext(), MapActivity.class);
i.putExtra("лат", 33.835293);
i.putExtra("СПГ", -117.914505);
i.putExtra(MapActivity.Лат, Т);
i.putExtra(MapActivity.СПГ, тр);
startActivity(i);

}
}

И в MapActivity:

Пачка пачка = так().getExtras();
dLatitude = bundle.getDouble("лат");
dLongitude = bundle.getDouble("Lng");
if (bundle.containsKey(лат)) {
mTours = пачке.и getString(лат, СПГ);
}

Это моя последняя проблема. После этого я больше не буду вас беспокоить.
Большое спасибо за вашу помощь.

David Crow

Ваши последние два звонка в putExtra() использующийся MapActivity.Lat и MapActivity.Lng, но ваши два звонка к getDouble() используются клавиши "Lat" и "Lng".

В дополнение, t и tr являются String типы пока dLatitude и dLongitude являются double типы.

Member 13593129

Как, по-твоему, я должен решить эту проблему?

David Crow

Серьезно?

dLatitude = bundle.getDouble(Lat);
dLongitude = bundle.getDouble(Lng);

Member 13593129

Это у меня уже есть. И это работает, проблема в том, что открывается карта с одним и тем же местоположением.

David Crow

- Это у меня уже есть."

Я так не думаю.

"...проблема в том, что открывается карта с одним и тем же местоположением."

Потому что вы извлекаете статические координаты из пакета (а не из Firebase).

Member 13593129

Ладно, я понял. Как это изменить, чтобы вытягивать lat и lng из Firebase, а не из bundle?

David Crow

Разве вы уже не получаете координаты с помощью:

String t = ((Tours)lvTours.getAdapter().getItem(position)).getLat();
String tr = ((Tours)lvTours.getAdapter().getItem(position)).getLng();
Независимо от того, откуда они берутся, вам все равно нужно поместить их в пакет намерения, чтобы их можно было извлечь в onMapReady().

Member 13593129

По какой-то причине он этого не делает.Не знаю, в чем тут дело.
Я сделал то же самое для YT videos, где у меня есть URL, хранящийся на FB, и он работает безупречно.

David Crow

Так что же тогда хранится внутри t и tr?

Member 13593129

Как видите. В первом одна широта, а во втором одна долгота.

David Crow

Ранее вы сказали, - По какой-то причине он этого не делает. Не знаю, в чем тут дело." А до этого ты сказал, - Как это изменить, чтобы вытащить лат и СПГ с огневой базы." Это противоречит тому, что вы только что сказали. Либо вы получаете координаты, либо нет. И что же это такое?

Member 13593129

Я не понимаю координаты.

David Crow

Тогда отображение карты с маркерами здесь не является проблемой (или, по крайней мере, больше не является). Начните новую тему, предпочтительно на самом форуме Android, чтобы поговорить о реальной проблеме с извлечением данных из хранилища Firebase.

Member 13593129

Хорошо. Спасибо за вашу помощь.

1 Ответов

Рейтинг:
11

David Crow

Минимальный объем кода, который я могу придумать, чтобы открыть карту, выглядит следующим образом:

activity_maps.xml:

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:map="http://schemas.android.com/apk/res-auto"
          xmlns:tools="http://schemas.android.com/tools"
          android:id="@+id/map"
          android:name="com.google.android.gms.maps.SupportMapFragment"
          android:layout_width="match_parent"
          android:layout_height="match_parent" />

public class MainActivity extends AppCompatActivity
{
    @Override
    protected void onCreate( Bundle savedInstanceState )
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);

        Intent intent = new Intent(this, MapsActivity.class);
        intent.putExtra("LATITUDE", 38.65452);
        intent.putExtra("LONGITUDE", -90.18471);
        startActivity(intent);
    }
}

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback
{
    private double dLatitude = 0.0;
    private double dLongitude = 0.0;

    private GoogleMap mMap;

    //================================================================

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

        Bundle bundle = getIntent().getExtras();
        dLatitude = bundle.getDouble("LATITUDE");
        dLongitude = bundle.getDouble("LONGITUDE");

        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    //================================================================

    @Override
    public void onMapReady( GoogleMap googleMap )
    {
        mMap = googleMap;

        LatLng latlng = new LatLng(dLatitude, dLongitude);
        mMap.addMarker(new MarkerOptions().position(latlng).title("Marker"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(latlng));
    }
}
Вы можете добавить к нему отсюда.