Clase no encontrada al desmarcar: android.support.v7.widget.Toolbar $ SavedState
Estoy usando la API de Google Maps para crear una aplicación Android sencilla y obtuve un error extraño que no puedo resolver. Por lo general sucede cuando hago girar mi dispositivo. Estoy utilizando google services 8.4.0
4-23 15:39:47.503 9419-9419/com.licenta.vladut.mmap E/Parcel: Class not found when unmarshalling: android.support.v7.widget.Toolbar$SavedState java.lang.ClassNotFoundException: android.support.v7.widget.Toolbar$SavedState at java.lang.Class.classForName(Native Method) at java.lang.Class.forName(Class.java:308) at android.os.Parcel.readParcelableCreator(Parcel.java:2275) at android.os.Parcel.readParcelable(Parcel.java:2239) at android.os.Parcel.readValue(Parcel.java:2146) at android.os.Parcel.readSparseArrayInternal(Parcel.java:2540) at android.os.Parcel.readSparseArray(Parcel.java:1868) at android.os.Parcel.readValue(Parcel.java:2203) at android.os.Parcel.readArrayMapInternal(Parcel.java:2479) at android.os.BaseBundle.unparcel(BaseBundle.java:221) at android.os.Bundle.getBundle(Bundle.java:782) at com.google.android.gms.maps.internal.ao.a(:com.google.android.gms.alldynamite:74) at maps.ei.bu.a(Unknown Source) at maps.ei.na(Unknown Source) at com.google.android.gms.maps.internal.i$a.onTransact(:com.google.android.gms.alldynamite:107) at android.os.Binder.transact(Binder.java:380) at com.google.android.gms.maps.internal.IMapFragmentDelegate$zza$zza.onCreateView(Unknown Source) at com.google.android.gms.maps.SupportMapFragment$zza.onCreateView(Unknown Source) at com.google.android.gms.dynamic.zza$4.zzb(Unknown Source) at com.google.android.gms.dynamic.zza.zza(Unknown Source) at com.google.android.gms.dynamic.zza.onCreateView(Unknown Source) at com.google.android.gms.maps.SupportMapFragment.onCreateView(Unknown Source) at android.support.v4.app.Fragment.performCreateView(Fragment.java:1974) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1036) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1230) at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2315) at android.support.v4.app.FragmentController.onCreateView(FragmentController.java:120) at android.support.v4.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:357) at android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(BaseFragmentActivityHoneycomb.java:31) at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:80) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:733) at android.view.LayoutInflater.inflate(LayoutInflater.java:482) at android.view.LayoutInflater.inflate(LayoutInflater.java:414) at android.view.LayoutInflater.inflate(LayoutInflater.java:365) at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:276) at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:136) at com.licenta.vladut.mmap.MainActivity.onCreate(MainActivity.java:54) at android.app.Activity.performCreate(Activity.java:6020) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2259) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2368) at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3947) at android.app.ActivityThread.access$900(ActivityThread.java:149) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1290) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5292) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703) Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.v7.widget.Toolbar$SavedState" on path: DexPathList[[zip file "/data/data/com.google.android.gms/app_chimera/m/00000000/DynamiteModules-prod.apk"],nativeLibraryDirectories=[/data/data/com.google.android.gms/app_chimera/m/00000000/n/armeabi-v7a, /vendor/lib, /system/lib]] at dalvik.system.BaseDexClassLoader.f 04-23 15:39:47.503 9419-9419/com.licenta.vladut.mmap D/AndroidRuntime: Shutting down VM 04-23 15:39:47.505 9419-9419/com.licenta.vladut.mmap E/AndroidRuntime: FATAL EXCEPTION: main Process: com.licenta.vladut.mmap, PID: 9419 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.licenta.vladut.mmap/com.licenta.vladut.mmap.MainActivity}: android.view.InflateException: Binary XML file line #2: Error inflating class fragment at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2306) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2368) at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3947) at android.app.ActivityThread.access$900(ActivityThread.java:149) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1290) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5292) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703) Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class fragment at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:763) at android.view.LayoutInflater.inflate(LayoutInflater.java:482) at android.view.LayoutInflater.inflate(LayoutInflater.java:414) at android.view.LayoutInflater.inflate(LayoutInflater.java:365) at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:276) at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:136) at com.licenta.vladut.mmap.MainActivity.onCreate(MainActivity.java:54) at android.app.Activity.performCreate(Activity.java:6020) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2259) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2368) at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3947) at android.app.ActivityThread.access$900(ActivityThread.java:149) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1290) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5292) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703) Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: android.support.v7.widget.Toolbar$SavedState at android.os.Parcel.readParcelableCreator(Parcel.java:2289) at android.os.Parcel.readParcelable(Parcel.java:2239) at android.os.Parcel.readValue(Parcel.java:2146) at android.os.Parcel.readSparseArrayInternal(Parcel.java:2540) at android.os.Parcel.readSparseArray(Parcel.java:1868) at android.os.Parcel.readValue(Parcel.java:2203) at android.os.Parcel.readArrayMapInternal(Parcel.java:2479) at android.os.BaseBundle.unparcel(BaseBundle.java:221) at android.os.Bundle.getBundle(Bundle.java:782) at com.google.android.gms.maps.internal.ao.a(:com.google.android.gms.alldynamite:74) at maps.ei.bu.a(Unknown Source) at maps.ei.na(Unknown Source) at com.google.android.gms.maps.internal.i$a.onTransact(:com.google.android.gms.alldynamite:107) at android.os.Binder.transact(Binder.java:380) at com.google.android.gms.maps.internal.IMapFragmentDelegate$zza$zza.onCreateView(Unknown Source) at com.google.android.gms.maps.SupportMapFragment$zza.onCreateView(Unknown Source) at com.google.android.gms.dynamic.zza$4.zzb(Unknown Source) at com.google.android.gms.dynamic.zza.zza(Unknown Source) at com.google.android.gms.dynamic.zza.onCreateView(Unknown Source) at com.google.android.gms.maps.SupportMapFragment.onCreateView(Unknown Source) at android.support.v4.app.Fragment.performCreateView(Fragment.java:1974) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1036) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1230) at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2315) at android.support.v4.app.FragmentController.onCreateView(FragmentController.java:120) at android.support.v4.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:357) at android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(BaseFragmentActivityHoneycomb.java:31) at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:80) at android.view.LayoutInf
Mi MainActivity.java es
- Cómo extraer archivos apk de la PC?
- Mi aplicación no está visible en Google Play Store para Samsung Galaxy Note 4
- Disposición de la pantalla de preferencias de Android
- ¿Cómo acceder a <item> desde un recurso <string-array> en un XML android?
- SetCompoundDrawablesWithIntrinsicBounds (int, int, int, int) no funciona
package com.licenta.vladut.mmap; import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.support.v4.app.ActivityCompat; import android.support.v4.app.Fragment; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; import com.google.android.gms.appindexing.AppIndex; import com.google.android.gms.auth.api.Auth; import com.google.android.gms.auth.api.signin.GoogleSignInOptions; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GoogleApiAvailability; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.common.api.ResultCallback; import com.google.android.gms.common.api.Status; import com.google.android.gms.maps.CameraUpdate; 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; public class MainActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener, OnMapReadyCallback { GoogleMap mMap; private static final double BM_LAT = 47.6595076, BM_LNG = 23.5631243; private Toolbar toolbar; private GoogleApiClient mGoogleApiClient; private static final String TAG = "SignInActivity"; private static final int ERROR_DIALOG_REQUEST = 9001; private static final int RC_SIGN_IN = 9002; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestEmail() .build(); mGoogleApiClient = new GoogleApiClient.Builder(this) .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .addApi(AppIndex.API).build(); if (checkPlayServices()) { setContentView(R.layout.activity_map); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); (MainActivity.this).setSupportActionBar(toolbar); SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); mapFragment.getMapAsync(this); } else { setContentView(R.layout.activity_main); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.sign_out) { signOut(); return true; } return super.onOptionsItemSelected(item); } private void signOut() { Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback( new ResultCallback<Status>() { @Override public void onResult(Status status) { toSignIn(); } }); } private void toSignIn() { Intent i = new Intent(this, SignInActivity.class); startActivity(i); } @Override public void onConnectionFailed(ConnectionResult connectionResult) { // An unresolvable error has occurred and Google APIs (including Sign-In) will not // be available. Log.d(TAG, getString(R.string.onConnectionFailed) + connectionResult); } private boolean checkPlayServices() { GoogleApiAvailability googleAPI = GoogleApiAvailability.getInstance(); int result = googleAPI.isGooglePlayServicesAvailable(this); if (result != ConnectionResult.SUCCESS) { if (googleAPI.isUserResolvableError(result)) { googleAPI.getErrorDialog(this, result, ERROR_DIALOG_REQUEST).show(); } else { Toast.makeText(this, "Nu se poate conecta la Google Play Services!", Toast.LENGTH_SHORT).show(); } return false; } return true; } @Override public void onMapReady(final GoogleMap map) { this.mMap = map; gotoLocation(BM_LAT,BM_LNG,18); } private void gotoLocation(double lat, double lng, float zoom){ LatLng latLng = new LatLng(lat, lng); CameraUpdate update = CameraUpdateFactory.newLatLngZoom(latLng,zoom); mMap.moveCamera(update); } }
Activity_main.xml es
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="wrap_content" android:layout_height="match_parent" tools:context="com.licenta.vladut.mmap.MainActivity"> <include android:id="@+id/toolbar" layout="@layout/toolbar" /> </RelativeLayout>
Activity_map.xml es
<?xml version="1.0" encoding="utf-8"?> <fragment xmlns:android="http://schemas.android.com/apk/res/android" xmlns:map="http://schemas.android.com/apk/res-auto" android:id="@+id/map" android:name="com.google.android.gms.maps.SupportMapFragment" android:layout_width="match_parent" android:layout_height="match_parent"> <include android:id="@+id/toolbar" layout="@layout/toolbar" /> </fragment>
Y finalmente, toolbar.xml es
<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.Toolbar android:background="?attr/colorPrimary" android:id="@+id/toolbar" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:minHeight="?attr/actionBarSize" android:layout_width="match_parent" android:layout_alignParentStart="true" android:elevation="4dp" app:popupTheme="@style/AppTheme.PopupOverlay" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android"> </android.support.v7.widget.Toolbar>
- ImageViews en LinearLayout redondeado
- ¿Se refiere a una cadena de otra cadena en strings.xml?
- Nuevo patrón de diseño de la actividad de Android Studio content_main.xml
- Android.view.inflateexception binario archivo xml línea # 1 error inflar clase android.widget.relativeLayout
- ¿Cómo leer el archivo xml local es la carpeta de recursos como un flujo de entrada en Android?
- Android Studio activity_main.xml editor de diseño no me deja arrastrar y soltar nada ...?
- Analizar el feed RSS de Android
- Android 9 patch xml dibujable
Tras la rotación, su SupportMapFragment
se destruye y se vuelve a crear. Antes de que sea destruido, escribe su estado actual a un Parcel
, para ser utilizado en la restauración de su estado cuando se recrea. El estado guardado del Fragment
incluirá el estado de su View
secundaria y, puesto que ha anidado una Toolbar
dentro de él, también intenta guardarlo y restaurarlo. La clase de Toolbar
no tiene una clase interna SavedState
necesaria para ello, por lo que este proceso falla al intentar restaurar la instancia de la Toolbar
del Parcel
.
La solución es no anidar la Toolbar
– o cualquier otra View
, para el caso – dentro del elemento <fragment>
. En su lugar, tire de <include>
del <fragment>
, y colóquelos en otro ViewGroup
; Por ejemplo, un LinearLayout
vertical, o un RelativeLayout
.
No me gustaron las soluciones que me impusieron en mis diseños y arquitectura.
Esto es lo que hice para que funcione. Si observa su stacktrace, ClassNotFoundException viene de la línea de GoogleMaps. Así que si lo solucionamos, el problema ya no existe.
GoogleMaps pukes / lanzar un error cuando el savedInstanceState tiene otros elementos en él, además de su propio. La solución es dar a GoogleMaps su propio paquete dedicado.
// class property private static final String KEY_MAP_SAVED_STATE = "mapState"; // class methods @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mapView = findMapView(); // make your own method here Bundle mapState = (savedInstanceState != null) ? savedInstanceState.getBundle(KEY_MAP_SAVED_STATE): null; mapView.onCreate(mapState); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Bundle mapState = new Bundle(); mapView.onSaveInstanceState(mapState); outState.putBundle(KEY_MAP_SAVED_STATE, mapState); }
Una cosa a tener en cuenta es que no estoy usando el SupportMapFragment. Estoy usando un MapView directamente. Es posible que tenga que extender el SupportMapFragment para poder capturar los métodos de gancho y proporcionar un paquete en blanco / limpio
Cambiar activity_map.xml a este trabajo, gracias de nuevo Mike.
<?xml version="1.0" encoding="utf-8" ?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <include android:id="@+id/toolbar" layout="@layout/toolbar" /> <fragment xmlns:map="http://schemas.android.com/apk/res-auto" android:id="@+id/map" android:name="com.google.android.gms.maps.SupportMapFragment" android:layout_width="match_parent" android:layout_height="match_parent"> </fragment> </RelativeLayout>
- Cómo utilizar Parcel.readBooleanArray ()?
- Android – onTabChanged no se invoca al seleccionar una pestaña diferente