Google map fragment Второй день мучаюсь с ошибкой

179
09 ноября 2018, 23:20

Уже второй день пытаюсь прикрутить google карту, но все четно. В основном, брал инфу из документации google. Так же пробовал другие пути решения данной проблемы.

При сборке приложения, постоянно выходит одна и та же ошибка и почему то ссылается всегда на строку, где я инициализировал binding binding = DataBindingUtil.setContentView(this, R.layout.activity_screen_map);

Прошу помощи у более опытных коллег.

Кусок верстки с фрагментом

    <fragment
        android:id="@+id/mapView"
        class="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/toolbar" />
    <android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    style="@style/toolbar"/>

</android.support.constraint.ConstraintLayout>

Сам класс реализации:

private SupportMapFragment mapFragment; private GoogleMap googleMap;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_screen_map);
    //Getting an instance
    binding = DataBindingUtil.setContentView(this, R.layout.activity_screen_map);
    googleSignInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .build();
    googleApiClient = new GoogleApiClient.Builder(this)
            .enableAutoManage(this, this)
            .addApi(Auth.GOOGLE_SIGN_IN_API, googleSignInOptions)
            .build();
    mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapView);
    mapFragment.getMapAsync(this);
    //Call the toolbar
    setSupportActionBar(binding.toolbar);
    binding.toolbar.setTitle(getResources().getString(R.string.mapTitle));
}
@Override
public void onMapReady(GoogleMap gMap) {
    googleMap = gMap;
    LatLng sydney = new LatLng(-33.852, 151.211);
    googleMap.addMarker(new MarkerOptions().position(sydney)
            .title("Marker in Sydney"));
    googleMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
}

Манифест:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />
    <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="@string/google_maps_key" />
    <activity android:name=".MainActivity"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".ScreenMapActivity"
        android:screenOrientation="portrait"/>
    <activity android:name=".ScreenFamilyActivity"
        android:label="@string/contacts"
        android:launchMode="singleTop"
        android:screenOrientation="portrait"
        android:parentActivityName=".ScreenMapActivity"/>
    <activity android:name=".AddContactActivity"
        android:label="@string/addContact"></activity>
</application>

Все нужные зависимости подключены.

Сама ошибка:

android.view.InflateException: Binary XML file line #11: Error inflating class fragment

11 строка, это как раз строка где начинается фрагмент. Уже всю голову сломал себе.

Так же вот еще ниже ошибка Binary XML file line #11: Duplicate id 0x7f08006e, tag null, or parent id 0xffffffff with another fragment for com.google.android.gms.maps.SupportMapFragment

Там написано, что два одинаковых id. Я проверил все и ни чего не нашел.

Прошу не кидаться камнями, я только не давно начал изучать android и нуждаюсь в реальной помощи.

Answer 1

Проблема решена. Я до этого пробовал использовать MapView, но несколько иначе. Вчера пересмотрел данный подход и решил попробовать еще раз.

Вообщем код ниже.

Bundle mapViewBundle = null;
    if (savedInstanceState != null) {
        mapViewBundle = savedInstanceState.getBundle(MAP_VIEW_BUNDLE_KEY);
    }
    mapView = binding.mapV;
    mapView.onCreate(mapViewBundle);
    mapView.getMapAsync(this);
}
@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    Bundle mapViewBundle = outState.getBundle(MAP_VIEW_BUNDLE_KEY);
    if (mapViewBundle == null) {
        mapViewBundle = new Bundle();
        outState.putBundle(MAP_VIEW_BUNDLE_KEY, mapViewBundle);
    }
    mapView.onSaveInstanceState(mapViewBundle);
}
@Override
protected void onResume() {
    super.onResume();
    mapView.onResume();
}
@Override
protected void onStart() {
    super.onStart();
    mapView.onStart();
}
@Override
protected void onStop() {
    super.onStop();
    mapView.onStop();
}
@Override
protected void onPause() {
    mapView.onPause();
    super.onPause();
}
@Override
protected void onDestroy() {
    mapView.onDestroy();
    super.onDestroy();
}
@Override
public void onLowMemory() {
    super.onLowMemory();
    mapView.onLowMemory();
}
@Override
public void onMapReady(GoogleMap googleMap) {
    gmap = googleMap;
    gmap.setMinZoomPreference(12);
    LatLng ny = new LatLng(40.7143528, -74.0059731);
    gmap.moveCamera(CameraUpdateFactory.newLatLng(ny));
}

Да, и обязательно нужно промапить весь жизненный цикл активити.

На счет прошлой ошибки, если кто то встретит подобную и не поймет из-за чего она происходит.

Как написал в комментах @woesss. Я использовал в работе DataBinding. Из-за включение в activity fragment происходила спорная ситуация. Как я понимаю. Бандинг сам создавал фрагмент, далее пытался проинфлентится сам фрагмент с картой и из-за этого появлялась ошибка Duplicate id. Возможно я ошибаюсь.

READ ALSO
Посоветуйте хороший визуализатор по java?

Посоветуйте хороший визуализатор по java?

Нашел один хороший - Sourcetrail, но он не работает(ошибка 87, не найдена java-либа, подозреваю что ему нужна eclipse-jdt)Есть еще похожие?

220
Не меняется цвет приложения

Не меняется цвет приложения

При установки кастомной темы setTheme() почему-то меняется только цвет ColorPrimaryDarkВот сама тема

187
Android сжатие изоброжения

Android сжатие изоброжения

ЗдраствуйтеУ меня есть изоброжения в обьекте File

152
Локализация приложения для стран СНГ

Локализация приложения для стран СНГ

Есть два набора строковых ресурсов: дефолтный (англ) и русскийНеобходимо, установить русский язык, если пользователь выберет белорусский,...

166