Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Making a Snackbar Without a View?

I want to show a snackbar as soon as the user opens the Google Maps activity, but the thing is that there's no views in the activity to use as the first parameter of the activity (in the findViewById() of Snackbar.make()). What do I put there? Here's the java class code:

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(); } } 

Also, here is the activity xml code:

<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" /> 

And lastly, here's the stacktrace error:

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) 

Thanks for the help! :)

like image 369
Kelvin Kellner Avatar asked Aug 03 '16 15:08

Kelvin Kellner


People also ask

Is snackbar a view?

Snackbar in android is a new widget introduced with the Material Design library as a replacement of a Toast. Android Snackbar is light-weight widget and they are used to show messages in the bottom of the application with swiping enabled. Snackbar android widget may contain an optional action button.

How do I get rid of snackbar?

OnClickListener() { @Override public void onClick(View v) { } }). show(); The snackbar can be dismissed by a swipe.


1 Answers

I see some options... Not sure which one can fix your issue.

Simpliest

SupportMapFragment extends class android.support.v4.app.Fragment. This way, it has a method getView()

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

Find Root View

From this answer, there's a way to get the root view via:

getWindow().getDecorView().getRootView() 

So, maybe, you can do:

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

NOTE: This approach has the side effect mentioned in the comments below:

The message will be shown behind the bottom navigation bar if the following method will be used to get view getWindow().getDecorView().getRootView()

Add a dummy LinearLayout to get the View

Honestly, I'm not sure if this solution is possible. I'm not sure if you can add a LinearLayout above the Maps fragment... I think it is OK but since I never work with Maps API before, I'm not sure.

<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> 

and then:

Snackbar.make(findViewById(R.id.dummy_layout_for_snackbar), "Click the pin for more options", Snackbar.LENGTH_LONG).show(); 
like image 175
W0rmH0le Avatar answered Sep 21 '22 23:09

W0rmH0le