2016-08-03 10 views
11

जैसे ही उपयोगकर्ता Google मानचित्र गतिविधि खोलता है, मैं स्नैक्सबार दिखाना चाहता हूं, लेकिन बात यह है कि गतिविधि के पहले पैरामीटर के रूप में उपयोग करने के लिए गतिविधि में कोई विचार नहीं है (Snackbar.make() में)। मैं वहां क्या रखूं?एक दृश्य के बिना एक स्नैकबार बनाना?

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

इसके अलावा, यहां गतिविधि एक्सएमएल कोड है:: यहाँ जावा वर्ग कोड है

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) 

मदद के लिए धन्यवाद:

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

और अंत में, यहाँ स्टैकट्रेस त्रुटि है! :)

+0

कोशिश – W0rmH0le

उत्तर

31

मुझे कुछ विकल्प दिखाई देते हैं ... सुनिश्चित नहीं है कि कोई भी आपकी समस्या को ठीक कर सकता है।

Simpliest

SupportMapFragment वर्ग android.support.v4.app.Fragment फैली हुई है। इस तरह, यह एक तरीका है getView()

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

ढूँढें रूट देखें

From this answer, वहाँ एक रास्ता के माध्यम से जड़ दृश्य दिखाने के लिए है है:

getWindow().getDecorView().getRootView() 

तो, शायद, आप कर सकते हैं :

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

व्यू

ईमानदारी से, मुझे यकीन नहीं है कि यह समाधान संभव है या नहीं, यह सुनिश्चित करने के लिए एक डमी लीनियरआउट जोड़ें। मुझे यकीन नहीं है कि क्या आप मैप्स खंड के ऊपर एक लीनियरलाइट जोड़ सकते हैं ... मुझे लगता है कि यह ठीक है लेकिन चूंकि मैं पहले कभी भी मैप्स एपीआई के साथ काम नहीं करता, मुझे यकीन नहीं है।

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

और उसके बाद:

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

पहले दो तरीकों में से दोनों काम करते हैं "GetWindow() getDecorView() getRootView()।।" ठीक; लेकिन पहले व्यक्ति का उपयोग करने के लिए, मुझे 'स्नैपबार.मेक() 'एक्शन को' ऑनक्रेट() 'में स्थानांतरित करने की आवश्यकता है क्योंकि' नक्शाफ्रैगमेंट 'वैश्विक चर नहीं है। एक अजीब चीज जो हुआ वह यह है कि दोनों मामलों में स्नैकबार टेक्स्ट डिफ़ॉल्ट रूप से सफेद के बजाय काला दिखाई देता है, लेकिन मैं इसे कोड के भीतर मैन्युअल रूप से बदल सकता हूं। –

+10

संदेश को नीचे नेविगेशन बार के पीछे दिखाया जाएगा यदि निम्न विधि का उपयोग 'getWindow() प्राप्त करने के लिए किया जाएगा। GetDecorView()। GetRootView() ' –

1

शाहब रऊफ बताते हैं के रूप में, (getDecorView के माध्यम से दृश्य हो रही) तल में नेविगेशन पट्टी के पीछे Snackbar डाल सकता है। मैं निम्नलिखित कोड का उपयोग करें: (प्रयोग करें और अपने खुशी का विस्तार) द्वारा ") findViewById (" को बदलने के लिए

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(); 
    } 
} 
संबंधित मुद्दे