Создание экземпляра MapBox перед расширением макета фрагмента вызывает исключение

#android #android-fragments #kotlin #mapbox #mapbox-android

#Android #android-фрагменты #kotlin #mapbox #mapbox-android

Вопрос:

Я следую руководству MabBox поhttps://docs.mapbox.com/help/tutorials/android-navigation-sdk для создания простого фрагмента навигации, в котором используются базовые элементы.

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

Появляющаяся ошибка — это:

 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.parkingclientapplication, PID: 14257
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.parkingclientapplication/com.example.parkingclientapplication.activities.MapDirectionActivity}: android.view.InflateException: Binary XML file line #8: Binary XML file line #8: Error inflating class com.mapbox.mapboxsdk.maps.MapView
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
     Caused by: android.view.InflateException: Binary XML file line #8: Binary XML file line #8: Error inflating class com.mapbox.mapboxsdk.maps.MapView
     Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class com.mapbox.mapboxsdk.maps.MapView
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Constructor.newInstance0(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:334)
        at android.view.LayoutInflater.createView(LayoutInflater.java:647)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:790)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
        at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:287)
        at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:139)
        at com.example.parkingclientapplication.activities.MapDirectionActivity.onCreate(MapDirectionActivity.kt:15)
        at android.app.Activity.performCreate(Activity.java:6975)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
     Caused by: com.mapbox.mapboxsdk.exceptions.MapboxConfigurationException: 
    Using MapView requires calling Mapbox.getInstance(Context context, String accessToken) before inflating or creating the view. The access token parameter is required when using a Mapbox service.
    Please see https://www.mapbox.com/help/create-api-access-token/ to learn how to create one.
    More information in this guide https://www.mapbox.com/help/first-steps-android-sdk/#access-tokens.
        at com.mapbox.mapboxsdk.Mapbox.validateMapbox(Mapbox.java:165)
        at com.mapbox.mapboxsdk.Mapbox.getAccessToken(Mapbox.java:77)
        at com.mapbox.mapboxsdk.storage.FileSource.<init>(FileSource.java:234)
        at com.mapbox.mapboxsdk.storage.FileSource.getInstance(FileSource.java:68)
        at com.mapbox.mapboxsdk.maps.renderer.MapRenderer.<init>(MapRenderer.java:34)
E/AndroidRuntime:     at com.mapbox.mapboxsdk.maps.renderer.glsurfaceview.GLSurfaceViewMapRenderer.<init>(GLSurfaceViewMapRenderer.java:33)
        at com.mapbox.mapboxsdk.maps.MapView$5.<init>(MapView.java:294)
        at com.mapbox.mapboxsdk.maps.MapView.initialiseDrawingSurface(MapView.java:294)
        at com.mapbox.mapboxsdk.maps.MapView.initialize(MapView.java:137)
        at com.mapbox.mapboxsdk.maps.MapView.<init>(MapView.java:100)
            ... 25 more
  

Код для действия:

 class MapDirectionActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_map_direction)

        supportFragmentManager.inTransaction {
            add(R.id.form_clientNavMenu, MapDirectionFragment())
        }
        //Logout action on custom toolbar layout
        logout.setOnClickListener {
            val intent = Intent(this, MainActivity::class.java)
            startActivity(intent)
        }
    }
}
  

Код для метода onCreateView фрагмента является:

 override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        Mapbox.getInstance(context!!, getString(R.string.access_token))
        val view = inflater.inflate(R.layout.fragment_map_direction, container, false)

        mapView = view.findViewById(R.id.mapView)
        mapView.onCreate(savedInstanceState)
        mapView.getMapAsync(this)
        // Inflate the layout for this fragment
        return view
}
  

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

Комментарии:

1. В исключении указано: Caused by: com.mapbox.mapboxsdk.exceptions.MapboxConfigurationException: Using MapView requires calling Mapbox.getInstance(Context context, String accessToken) before inflating or creating the view. The access token parameter is required when using a Mapbox service. Please see https://www.mapbox.com/help/create-api-access-token/ to learn how to create one. More information in this guide https://www.mapbox.com/help/first-steps-android-sdk/#access-tokens. Вы забыли предоставить доступ через Mapbox.getInstance

Ответ №1:

Задайте метод:
Mapbox.getInstance(this,getString(R.string.access_token));
Перед:
setContentView(R.layout.activity_map);
Если у вас есть это исключение, измените структуру кода следующим образом.

то есть:

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Mapbox.getInstance(this,getString(R.string.access_token));
    setContentView(R.layout.activity_map);

    mapView = (MapView) findViewById(R.id.mapView);
    mapView.onCreate(savedInstanceState);
    mapView.getMapAsync(mapboxMap -> mapboxMap.setStyle(
            new Style.Builder().fromUrl(Style.MAPBOX_STREETS)
    ));
}
  

Ответ №2:

Спасибо @Tobrun за ответ, проблема была не в том, что я пропустил accessToken, но я смешал activity и fragment layout, поэтому компоненты в одном из них должны быть в другом. Однако поиск accessToken заставил меня понять о других возможных.