2016-08-03 22 views
11

Ich möchte eine Snackbar anzeigen, sobald der Benutzer die Google Maps-Aktivität öffnet, aber es gibt keine Ansichten in der Aktivität, die als erster Parameter der Aktivität verwendet werden sollen (in findViewById() von Snackbar.make()). Was lege ich da hin? Hier ist die Java-Klasse Code:Eine Snackbar ohne Aussicht machen?

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

Auch hier ist die Aktivität 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" /> 

Und schließlich ist hier der Stacktrace Fehler:

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) 

Danke für die Hilfe! :)

+0

Try "findViewById()" von – W0rmH0le

Antwort

31

Ich sehe einige Optionen ... Nicht sicher, welches Ihr Problem beheben kann.

Simpliest

SupportMapFragment erweitert Klasse android.support.v4.app.Fragment. Auf diese Weise ist es eine Methode hat getView()

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

Suche Stammansicht

From this answer, gibt es eine Möglichkeit, die Stammansicht über zu bekommen: Also, vielleicht

getWindow().getDecorView().getRootView() 

, können Sie tun :

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

Fügen Sie einen Dummy LinearLayout hinzu, um die Ansicht

zu bekommen. Ehrlich gesagt bin ich nicht sicher, ob diese Lösung möglich ist. Ich bin mir nicht sicher, ob Sie ein LinearLayout oberhalb des Maps-Fragments hinzufügen können ... Ich denke, es ist OK, aber da ich nie zuvor mit Maps API gearbeitet habe, bin ich mir nicht sicher.

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

und dann:

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

Beide der ersten beiden Methoden ersetzen arbeiten "getWindow() getDecorView() getRootView().." fein; Aber um die erste zu verwenden, musste ich die gesamte 'Snackbar.make()' Aktion in 'onCreate()' verschieben, da 'mapFragment' keine globale Variable ist. Das Seltsame, was passiert ist, ist, dass der Snackbar-Text in beiden Fällen standardmäßig schwarz statt weiß erscheint, aber ich kann ihn einfach manuell im Code ändern. –

+10

Die Nachricht wird hinter der unteren Navigationsleiste angezeigt, wenn die folgende Methode verwendet wird, um die Ansicht 'getWindow(). GetDecorView(). GetRootView()' zu erhalten –

1

Wie Shahab Rauf weist darauf hin, über getDecorView die Ansicht bekommen() im Boden der snackbar hinter der Navigationsleiste setzen kann. Ich verwende den folgenden Code ein: (Verwenden Sie und erweitern, um Ihre Freude)

public class BaseActivity extends AppCompatActivity { 

    private View getRootView() { 
     final ViewGroup contentViewGroup = (ViewGroup) findViewById(android.R.id.content); 
     View rootView = null; 

     if(contentViewGroup != null) 
      rootView = contentViewGroup.getChildAt(0); 

     if(rootView == null) 
      rootView = getWindow().getDecorView().getRootView(); 

     return rootView; 
    } 

    protected void showSnackBarWithOK(@StringRes int res) { 
     final View rootView = getRootView(); 
     if(rootView != null) { 
      final Snackbar snackbar = Snackbar.make(getRootView(), res, Snackbar.LENGTH_INDEFINITE); 
      snackbar.setAction(R.string.ok, new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        snackbar.dismiss(); 
       } 
      }); 

      snackbar.show(); 
     } 
    } 

    protected void showSnackBar(@StringRes int res) { 
     final View rootView = getRootView(); 
     if(rootView != null) 
      Snackbar.make(rootView, res, Snackbar.LENGTH_LONG).show(); 
    } 
}