Android Studio "ошибка: несовместимые типы: фрагмент не может быть преобразован в SupportMapFragment" - PullRequest
0 голосов
/ 10 октября 2018

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

Когда я пытаюсь скомпилировать в Android Studio, это дает мне ошибку в моей карте "инициализировать строку ошибка:

 incompatible types: Fragment cannot be converted to SupportMapFragment"

Ошибкавозникает на initMap():

строка:

SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);

Эта проблема возникла после того, как я изменил свой импорт с import android.support.v4.app.Fragment; на import android.app.Fragment; (который я должен сохранить из-за других ошибок приложения)

Вот мой фрагмент кода:

public class MapFragment extends Fragment implements OnMapReadyCallback
{

    private static final String TAG = "MapFragment";

    private Boolean LocationPermissionsGranted = false;  //boolean for location method
    private GoogleMap Map;
    private static final int ERROR_REQUEST = 69; //error code relates to isservicesOK method
    private static final String FINE_LOCATION = Manifest.permission.ACCESS_FINE_LOCATION;
    private static final String COURSE_LOCATION = Manifest.permission.ACCESS_COARSE_LOCATION;
    private static final int LOCATION_PERMISSION_CODE = 1234;

    public MapFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate( savedInstanceState );
        //TODO: Instead of hardcoding the title perhaps take the user name from somewhere?
        // Note the use of getActivity() to reference the Activity holding this fragment
        getActivity().setTitle( "YOUR CLINICS" );
        isServicesOK();
        getLocationPermission();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        ButterKnife.bind( getActivity() );

        return inflater.inflate( R.layout.fragment_map, container, false );


    }
    @Override
    public void onMapReady(GoogleMap googleMap) {
        Toast.makeText(getActivity(), "Maps is ready", Toast.LENGTH_SHORT).show();
        Log.d(TAG, "Map is ready");
        Map = googleMap;
    }
    private void initMap() {
        Log.d(TAG, "initializing map...");
        SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map); //ignore warning

        mapFragment.getMapAsync(MapFragment.this);
    }

    private void getLocationPermission()
    {
        Log.d(TAG, "Retrieving location permissions");
        String[] permissions = {android.Manifest.permission.ACCESS_FINE_LOCATION,
                android.Manifest.permission.ACCESS_COARSE_LOCATION};

        if (ContextCompat.checkSelfPermission(this.getActivity().getApplicationContext(), //ignore
                FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
            if (ContextCompat.checkSelfPermission(this.getActivity().getApplicationContext(),
                    COURSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
                LocationPermissionsGranted = true;
            } else {
               requestPermissions(permissions,
                        LOCATION_PERMISSION_CODE);
            }
        } else {
            requestPermissions(permissions,
                    LOCATION_PERMISSION_CODE);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
    {
        Log.d(TAG, "onRequestPermissionsResult: called.");
        LocationPermissionsGranted = false;

        switch (requestCode)
        {
            case LOCATION_PERMISSION_CODE:
            {
                if (grantResults.length > 0)
                {
                    for (int i = 0; i < grantResults.length; i++) //ignore
                    {
                        if (grantResults[i] != PackageManager.PERMISSION_GRANTED)
                        {
                            LocationPermissionsGranted = false;
                            Log.d(TAG, "onRequestPermissionsResult: permission failed");
                            return;
                        }
                    }
                    Log.d(TAG, "onRequestPermissionsResult: permission granted");
                    LocationPermissionsGranted = true;
                    //if permissions are granted we initialize the map
                    initMap();
                }
            }
        }
    }


    // integrate this method with the start of the application eg after a button has been clicked
    // Debugging method- checks if google services is available/functional
    public boolean isServicesOK ()
    {
        Log.d(TAG, "isServicesOK: checking if your Google Services is up to date"); //debugging

        int available = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(getActivity()); /*//log d = debug*/

        if (available == ConnectionResult.SUCCESS)
        {
            /*//checks if everything is fine*/
            Log.d(TAG, "isServicesOK: Google Play Services is functional");
            return true;
        }
        else if (GoogleApiAvailability.getInstance().isUserResolvableError(available))
        {
            /* //If an error occurs, and it is resolvable*/
            Log.d(TAG, "isServicesOK: A fixable error has occured!");
            Dialog dialog = GoogleApiAvailability.getInstance().getErrorDialog(getActivity(), available, ERROR_REQUEST);
            dialog.show();  /*//This prompts google to provide a error message and solution when a fixable error has occurred*/
        }

        else
        {
            Toast.makeText(getActivity(), "Google Play Services is dysfunctional, sorry!", Toast.LENGTH_SHORT).show(); /*//if it cant be fixed for whatever reason lmao*/
        }
        return false;
    }

}

1 Ответ

0 голосов
/ 10 октября 2018

Эта проблема возникла после того, как я изменил свой импорт из импорта android.support.v4.app.Fragment;импортировать android.app.Fragment;(который я должен сохранить из-за других ошибок приложения)

Вы не можете использовать SupportMapFragment без использования API библиотеки фрагментов поддержки.SupportMapFragment является Фрагментом библиотеки поддержки, и хотя Фрагмент фреймворка и Фрагмент библиотеки поддержки имеют одинаковое имя и очень похожие методы, они не являются одинаковыми и не могут быть смешаны.

SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map); //ignore warning

При работе с API-интерфейсом Fragment Framework (вместо API библиотеки поддержки), getChildFragmentManager() может управлять только Фрагментами Framework.Поэтому этот FragmentManager не может вернуть SupportMapFragment.

Если вы хотите использовать SupportMapFragment, вам нужно изменить оставшуюся часть приложения, чтобы разрешить вам использовать библиотеку поддержки Fragments.

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