it-swarm.com.de

Eine Snackbar ohne Aussicht machen?

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! :)

26
Kelvin Kellner

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();
52
W0rmH0le

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

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>
0
Rami Alloush

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();
0
Wincelee

Versuchen Sie dies bei jeder Aktivität:

snackbar(findViewById(Android.R.id.content),"your text")
0
Umasankar