support studio stackoverflow snack not length_long found coordinatorlayout bar java android xml crash android-snackbar

java - studio - snackbar in android



Hacer un Snackbar sin una vista? (1)

Quiero mostrar un snack bar tan pronto como el usuario abre la actividad de Google Maps, pero el hecho es que no hay vistas en la actividad para usar como el primer parámetro de la actividad (en el findViewById() de Snackbar.make() ) . ¿Qué pongo ahí? Aquí está el código de clase java:

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback { private GoogleMap mMap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_maps); // Obtain the SupportMapFragment and get notified when the map is ready to be used. SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); mapFragment.getMapAsync(this); } @Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; mMap.setBuildingsEnabled(true); mMap.getUiSettings().setZoomControlsEnabled(true); float cameraZoom = 17; LatLng location = new LatLng(43.404032, -80.478184); mMap.addMarker(new MarkerOptions().position(location).title("49 McIntyre Place #18, Kitchener, ON N2R 1G3")); CameraUpdateFactory.newLatLngZoom(location, cameraZoom); Snackbar.make(findViewById(/*WHAT DO I PUT HERE?*/), "Click the pin for more options", Snackbar.LENGTH_LONG).show(); } }

Además, aquí está el código de actividad xml:

<fragment xmlns:android="http://schemas.android.com/apk/res/android" xmlns:map="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/map" android:name="com.google.android.gms.maps.SupportMapFragment" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="ca.davesautoservice.davesautoservice.MapsActivity" />

Y, por último, aquí está el error stacktrace:

08-03 11:42:21.333 3901-3901/? E/AndroidRuntime: FATAL EXCEPTION: main Process: ca.davesautoservice.davesautoservice, PID: 3901 java.lang.NullPointerException at android.support.design.widget.Snackbar.<init>(Snackbar.java:183) at android.support.design.widget.Snackbar.make(Snackbar.java:215) at ca.davesautoservice.davesautoservice.MapsActivity.onMapReady(MapsActivity.java:48) at com.google.android.gms.maps.SupportMapFragment$zza$1.zza(Unknown Source) at com.google.android.gms.maps.internal.zzo$zza.onTransact(Unknown Source) at android.os.Binder.transact(Binder.java:361) at xz.a(:com.google.android.gms.DynamiteModulesB:82) at maps.ad.u$5.run(Unknown Source) at android.os.Handler.handleCallback(Handler.java:808) at android.os.Handler.dispatchMessage(Handler.java:103) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:5333) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:828) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:644) at dalvik.system.NativeStart.main(Native Method)

¡Gracias por la ayuda! :)


Veo algunas opciones ... No estoy seguro de cuál puede solucionar su problema.

Simpliest

SupportMapFragment extiende la clase android.support.v4.app.Fragment . De esta manera, tiene un método getView()

Snackbar.make(mapFragment.getView(), "Click the pin for more options", Snackbar.LENGTH_LONG).show();

Buscar vista de raíz

A partir de esta respuesta , hay una forma de obtener la vista raíz a través de:

getWindow().getDecorView().getRootView()

Entonces, tal vez, puedes hacer:

Snackbar.make(getWindow().getDecorView().getRootView(), "Click the pin for more options", Snackbar.LENGTH_LONG).show();

Agregue un LinearLayout ficticio para obtener la vista

Honestamente, no estoy seguro si esta solución es posible. No estoy seguro de si puede agregar un LinearLayout sobre el fragmento de Maps ... Creo que está bien, pero dado que nunca he trabajado antes con Maps API, no estoy seguro.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/dummy_layout_for_snackbar" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <fragment xmlns:map="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/map" android:name="com.google.android.gms.maps.SupportMapFragment" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="ca.davesautoservice.davesautoservice.MapsActivity" /> </LinearLayout>

y entonces:

Snackbar.make(findViewById(R.id.dummy_layout_for_snackbar), "Click the pin for more options", Snackbar.LENGTH_LONG).show();