2016-08-03 2 views
11

ユーザーがGoogleマップのアクティビティを開くとすぐにスナックバーを表示したいのですが、アクティビティの最初のパラメータ(findViewById()Snackbar.make())として使用するアクティビティのビューはありません。何を私はそこに置くのですか? は、ここでのJavaクラスのコードです:ビューなしのスナックバーを作成するには?

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

はまた、ここでの活動のXMLコードは次のとおりです。

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

そして最後に、ここにスタックトレースのエラーです:助けを

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) 

ありがとう! :)

+0

で "findViewById()" を置き換えるようにしてください "は、GetWindow()getDecorView()getRootView()。。" – W0rmH0le

答えて

31

いくつかのオプションがあります...あなたの問題を解決できるものが不明です。

最も単純

SupportMapFragmentクラスandroid.support.v4.app.Fragmentを拡張します。この方法では、それは検索ルートビュー

From this answerは、経由ルートビュー取得する方法がありますgetView()

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

方法があります。だから、

getWindow().getDecorView().getRootView() 

を、多分、あなたが行うことができます:

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

ダミーLinearLayoutを追加してビューを取得

正直なところ、この解決策が可能かどうかはわかりません。 Mapフラグメントの上にLinearLayoutを追加できるかどうかはわかりませんが、これは問題ないと思いますが、以前はMaps APIを使用していないため、わかりません。

<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

:私は、次のコードを使用します罰金;最初のものを使うには、 'mapFragment'がグローバル変数ではないので、' Snackbar.make() 'アクションを' onCreate() 'に移動する必要がありました。起こった変わったことは、どちらの場合でも、デフォルトではスナックバーのテキストが白ではなく黒で表示されますが、コード内で手動で変更することができます。 –

+10

次のメソッドを使用して 'getWindow()。getDecorView()。getRootView()'を取得すると、メッセージが下部ナビゲーションバーの後ろに表示されます。 –

1

をシャハブラウフはgetDecorView(経由ビューを取得し、指摘するように)下でのナビゲーションバーの後ろスナックバーを置いてもよいです。最初の2つの方法の作業の両方を(使用して、あなたの喜びに及ぶ)

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(); 
    } 
} 
関連する問題