Метод getSupportFragmentManager() не определен для типа MapFragment

Я пытаюсь реализовать отображение карты Google, и ниже приведены мои коды:

package com.fragments;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;

public class MapFragment extends SherlockMapFragment {

    private GoogleMap mMap;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View root = super.onCreateView(inflater, container, savedInstanceState);
        SupportMapFragment mapFrag= (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.fragment_map);
        mMap = mapFrag.getMap();
        return root;
    }
}

Я получаю сообщение об ошибке, что getSupportFragmentManager() не определен для типа MapFragment. Однако я немного запутался, так как импортировал com.google.android.gms.maps.SupportMapFragment. не должен ли тогда этот метод появиться? Я пропускаю некоторые шаги, чтобы заставить этот метод работать?

2 ответа

Решение

Если вы используете этот SherlockMapFragment, попробуйте:

getSherlockActivity().getSupportFragmentManager();

Чувак, я провел последние пару часов, читая этот и два других твоих вопроса (среди прочих), потому что у меня была точно такая же проблема. У меня было приложение, работающее с ABS+GMapsV2.0+FragmentActivity, но, поскольку я много слышал о том, что полезно иметь все это во фрагментах, я начал переносить его на фрагменты и FragmentActivities в качестве контейнеров.

Когда я портировал карту, все произошло точно так же, getSupportFragmentManager() не был распознан, и мне не очень понравилось предлагаемое решение по созданию SherlockMapFragment, портящего библиотеку ABS, поэтому я продолжал копать.

Скорее всего, вы уже знали об этом, но я просто понимаю, что вы (как и я 10 минут назад) пытались обработать фрагмент, который определен в xml, но еще не создан (проиндексирован).

Взглянув на документацию, проверяющую порядок вызовов во фрагментных методах, я попробовал код в другом методе после onCreateView()... и изменил getSupportFragmentManager () для getFragmentManager() или даже следуя решению, данному с использованием getSherlockActivity(). GetSupportFragmentManager () Я мог бы обработать те фрагменты, которые уже существуют.

public class MapsFragment extends SherlockFragment {


private SupportMapFragment mSupportMapFragment;
private GoogleMap map;
private Marker spotAMarker;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.maps_fragment, container, false);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    mSupportMapFragment = (SupportMapFragment) getFragmentManager().findFragmentById(R.id.map_fragment_test); //THIS ONE
    mSupportMapFragment = (SupportMapFragment) getSherlockActivity().getSupportFragmentManager().findFragmentById(R.id.map_fragment_test); //OR THIS ONE
    if(mSupportMapFragment != null) {
        map = mSupportMapFragment.getMap(); 

        if(map != null) {

            spotAMarker = map.addMarker(new MarkerOptions().position(new LatLng(4.651904,-74.057352)).
                    title(getString(R.string.spot_a_title)).snippet(getString(R.string.spot_a_subtitle)).
                    icon(BitmapDescriptorFactory.fromAsset("images/spot_a.png")));
            spotAMarker.setDraggable(true);

        } else {
            Toast.makeText(this.getActivity(), getString(R.string.no_map_error), Toast.LENGTH_LONG).show();
        }

    } else {
        Toast.makeText(this.getActivity(), "No Map Fragment", Toast.LENGTH_LONG).show();
    }
    super.onActivityCreated(savedInstanceState);
}
}

Может быть, у вас уже есть решение этой проблемы, но я хотел бы поделиться своим опытом с другими, застрявшими в той же проблеме.

Другие вопросы по тегам