Ich möchte eine Snackbar anzeigen, sobald der Nutzer die Google Maps-Aktivität öffnet. In der Aktivität gibt es jedoch keine Ansichten, die als erster Parameter der Aktivität verwendet werden sollen (in findViewById()
von Snackbar.make()
). Was muss ich dort einfügen? Hier ist der Java-Klassencode:
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();
}
}
Hier ist auch der Aktivitäts-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 zum Schluss noch 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! :)
Ich sehe einige Optionen ... Nicht sicher, welche das Problem beheben kann.
Einfachste
SupportMapFragment
erweitert die Klasse Android.support.v4.app.Fragment
. Auf diese Weise hat es eine Methode getView()
Snackbar.make(mapFragment.getView(), "Click the pin for more options", Snackbar.LENGTH_LONG).show();
Stammansicht suchen
Aus dieser Antwort gibt es eine Möglichkeit, die Root-Ansicht zu erhalten:
getWindow().getDecorView().getRootView()
Vielleicht können Sie also Folgendes tun:
Snackbar.make(getWindow().getDecorView().getRootView(), "Click the pin for more options", Snackbar.LENGTH_LONG).show();
Füge ein Dummy LinearLayout hinzu, um die Ansicht zu erhalten
Ich bin mir nicht sicher, ob diese Lösung möglich ist. Ich bin nicht sicher, ob Sie ein LinearLayout oberhalb des Maps-Fragments hinzufügen können ... Ich denke, es ist in Ordnung, aber da ich noch nie mit Maps API arbeite, 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();
Wie Shahab Rauf darauf hinweist, kann die Imbissbar durch getDecorView () nach der Navigationsleiste unten platziert werden. Ich verwende den folgenden Code: (Verwenden Sie und erweitern Sie zu Ihrer 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();
}
}
Ich würde sagen, dass findViewById
der beste Ansatz ist. Bei Verwendung von getWindow().getDecorView().getRootView()
wird die Nachricht hinter der unteren Navigationsleiste angezeigt.
In meinem Fall musste ich kein Dummy-Element in XML erstellen. Ich habe den folgenden Code verwendet
Snackbar.make(findViewById(R.id.container),"This will start payment process.", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
und meine XML-Datei lautet wie folgt
<Android.support.design.widget.CoordinatorLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true"
tools:context=".HomePatientActivity">
<Android.support.design.widget.AppBarLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:paddingTop="@dimen/appbar_padding_top"
Android:theme="@style/AppTheme.AppBarOverlay">
<Android.support.v7.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:layout_weight="1"
Android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/AppTheme.PopupOverlay">
</Android.support.v7.widget.Toolbar>
<Android.support.design.widget.TabLayout
Android:id="@+id/sliding_tabs"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_weight="1"
app:layout_anchorGravity="top"
app:tabMode="fixed" />
</Android.support.design.widget.AppBarLayout>
<Android.support.v4.view.ViewPager
Android:id="@+id/container"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
</Android.support.v4.view.ViewPager>
<Android.support.design.widget.FloatingActionButton
Android:id="@+id/fab"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_gravity="end|bottom"
Android:layout_margin="@dimen/fab_margin"
app:srcCompat="@Android:drawable/ic_dialog_email" />
</Android.support.design.widget.CoordinatorLayout>
Fügen Sie ein beliebiges Layout hinzu und weisen Sie dem Layout ein ID-Beispiel zu:
<RelativeLayout
Android:id="@+id/relativeLayout"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<fragment
Android:id="@+id/map_fragment"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:name="com.google.Android.gms.maps.SupportMapFragment"
/>
</RelativeLayout>
Suchen Sie in Ihrer Aktivität das Layout mit findViewById:
RelativeLayout relativeLayout = findViewById(R.id.relativeLayout);
Beispiel für andere Layouts bzw. solange Sie den Layouts ihre IDs zuweisen:
LinearLayout relativeLayout = findViewById(R.id.linearLayout);
FrameLayout frameLayout = findViewById(R.id.frameLayout);
Anzeige der Snackbar:
Snackbar.make(relativeLayout,"You are displaying a Snackbar",Snackbar.LENGTH_SHORT).show();
Für andere Layouts ändern Sie einfach den Namen der Layoutbeispiele:
Snackbar.make(linearLayout,"You are displaying a Snackbar",Snackbar.LENGTH_SHORT).show();
Snackbar.make(frameLayout,"You are displaying a Snackbar",Snackbar.LENGTH_SHORT).show();
Versuchen Sie dies bei jeder Aktivität:
snackbar(findViewById(Android.R.id.content),"your text")