Fragmentmanager 2-я переменная

У меня проблема с FragmentManager. Я пытаюсь получить карту Google во фрагменте. Это мой фрагмент. Я хочу создать карту для данной позиции, используя com.google.android.gms:play-services:9.2.1

>

import android.os.Bundle;

import android.support.v4.app.FragmentActivity;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.spoturdeal.spoturdeal.R;


public class MapShopsFragment extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mapdeals);
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

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

        // Add a marker in Somewhere, and move the camera.
        LatLng somewhere = new LatLng(51, 6);
        mMap.addMarker(new MarkerOptions().position(somewhere).title("Marker in somewhere"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(somewhere));
    }
}

MainActivity имеет следующие импорты

>

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Process;
import android.support.design.widget.NavigationView;
import android.support.design.widget.Snackbar;
import android.support.v4.app.ActivityCompat;
import android.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import android.Manifest;


import com.spoturdeal.spoturdeal.R;
import com.spoturdeal.spoturdeal.fragments.MapShopsFragment;

Я проверил, что использую android.support.v4.app.FragmentActivity Код, в котором есть проблема, - это эта часть

>

private void displayInitialFragment() {

        MapShopsFragment mapShopsFragment = new MapShopsFragment();
        FragmentManager fragmentmanager = getSupportFragmentManager();
        fragmentmanager.beginTransaction()
                .setCustomAnimations(R.anim.anim_slide_in_from_left, R.anim.anim_slide_out_from_left)
                .replace(R.id.relativelayout_for_fragment,
                       mapShopsFragment,          /** here is the Problem
                       mapShopsfragment.getTag() 
                ).commit();

    }

Сообщение об ошибке, которое я могу при сборке, это Ошибка: (77, 25) ошибка: несовместимые типы: MapShopsFragment не может быть преобразован в фрагмент

У меня есть еще несколько фрагментов, с которыми я работаю, у них есть проблемы. Они расширяются как ListFragments.

Я не хочу создавать карту в другом действии, потому что мне нужно настроить для нее меню дизайна материалов.

В строке состояния студии Android я получаю следующее сообщение

'replace(int, android.support.v4.app.Fragment)' в 'android.support.v4.app.FragmentTransaction' нельзя применить к '(int, com.spoturdeal.spoturdeal.fragments.MapShopsFragment)', но не понять, что под этим подразумевается.

Мне удалось заставить работать фрагмент с помощью @ben, чтобы заставить карту работать с игровыми сервисами: 9.2.1 было немного сложнее. Ниже приведено решение, которое отлично сработало.

>

public class MapShopsFragment extends Fragment implements OnMapReadyCallback {


    private MapView mapView;
    private GoogleMap googleMap;

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

    }
    public void  onViewCreated(View v, Bundle savedInstanceState) {

        mapView = (MapView) v.findViewById(R.id.map);
        mapView.onCreate(savedInstanceState);
        mapView.onResume();
        mapView.getMapAsync(this);

    }

    @Override
    public void onMapReady(GoogleMap map) {
        googleMap = map;
        ......
    }
}

person Charley57    schedule 27.07.2016    source источник


Ответы (1)


Проблема в том, что вы создаете FragmentActivity, а не фрагмент. Менеджер фрагментов ожидает, что вы передадите фрагмент поддержки. Чтобы то, что вы делаете, работало, MapShopsFragment должен расширять Fragment.

person Ben    schedule 27.07.2016
comment
Mine MainActivity нужен только импорт › com.spoturdeal.spoturdeal.fragments.MapShopsFragment; если я добавлю импорт android.support.v4.app.Fragment; он будет серым - person Charley57; 27.07.2016
comment
Привет Бен, спасибо за помощь до сих пор. Фрагмент вроде работает. Но теперь я не могу правильно отображать карту. Я получил эту ошибку › Вызвано: java.lang.ClassCastException: android.widget.FrameLayout не может быть приведен к com.google.android.gms.maps.MapView - person Charley57; 27.07.2016
comment
Вам нужно будет вставить код, где вы получаете исключение. Но это означает, что где-то вы увеличиваете или устанавливаете представление как FrameLayout вместо представления карты. - person Ben; 27.07.2016
comment
Привет, Бен, спасибо за твою помощь. Я запустил часть карты, и мое приложение работает отлично - person Charley57; 27.07.2016