如何在 Android Studio 中扩展 SupportMapFragment?

Joe*_*son 2 java android fragment google-maps-api-3 supportmapfragment

我想创建一个具有缩放设置、标记和地图类型设置的自定义地图片段,以便我可以在多个活动中重复使用它。我创建的类称为“LiteMap”。

\n\n

我从编译器处收到错误 \n \'Incompatible Types\' \'Required: com.mypackage.LiteMap\' \'Found com.google.android.gms.maps.SupportMapFragment\'\n我调用.newInstance. 我假设.newInstance返回父类而不是我的类,但我不确定如何在我的类中重写以返回我的“LiteMap”对象。

\n\n

作为替代方案,我尝试使用 new 实例化我的地图对象,并且在没有任何特定行作为源的情况下收到以下错误,但似乎使用 new 并没有创建 LiteMap 对象。我想做的事情是不可能的还是愚蠢的做法?

\n\n
03-29 20:36:52.771 11326-11326/com.tremulant.phield E/AndroidRuntime: FATAL EXCEPTION: main\n  Process: com.tremulant.phield, PID: 11326\n  java.lang.RuntimeException: Unable to resume activity {com.tremulant.phield/com.tremulant.phield.ReviewDetails}: java.lang.NullPointerException: Attempt to invoke interface method \'void maps.ei.bz.o()\' on a null object reference\n      at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2974)\n      at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3005)\n      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2371)\n      at android.app.ActivityThread.access$800(ActivityThread.java:149)\n      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284)\n      at android.os.Handler.dispatchMessage(Handler.java:102)\n      at android.os.Looper.loop(Looper.java:135)\n      at android.app.ActivityThread.main(ActivityThread.java:5290)\n      at java.lang.reflect.Method.invoke(Native Method)\n      at java.lang.reflect.Method.invoke(Method.java:372)\n      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)\n      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)\n   Caused by: java.lang.NullPointerException: Attempt to invoke interface method \'void maps.ei.bz.o()\' on a null object reference\n      at maps.ei.n.b(Unknown Source)\n      at com.google.android.gms.maps.internal.i$a.onTransact(:com.google.android.gms.alldynamite:115)\n      at android.os.Binder.transact(Binder.java:380)\n      at com.google.android.gms.maps.internal.IMapFragmentDelegate$zza$zza.onResume(Unknown Source)\n      at com.google.android.gms.maps.SupportMapFragment$zza.onResume(Unknown Source)\n      at com.google.android.gms.dynamic.zza$7.zzb(Unknown Source)\n      at com.google.android.gms.dynamic.zza.zza(Unknown Source)\n      at com.google.android.gms.dynamic.zza.onResume(Unknown Source)\n      at com.google.android.gms.maps.SupportMapFragment.onResume(Unknown Source)\n      at android.support.v4.app.Fragment.performResume(Fragment.java:2020)\n      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1107)\n      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252)\n      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1234)\n      at android.support.v4.app.FragmentManagerImpl.dispatchResume(FragmentManager.java:2056)\n      at android.support.v4.app.FragmentController.dispatchResume(FragmentController.java:196)\n      at android.support.v4.app.FragmentActivity.onResumeFragments(FragmentActivity.java:505)\n      at android.support.v4.app.FragmentActivity.onPostResume(FragmentActivity.java:494)\n      at android.support.v7.app.AppCompatActivity.onPostResume(AppCompatActivity.java:174)\n      at android.app.Activity.performResume(Activity.java:6119)\n      at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2963)\n      at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3005)\xc2\xa0\n      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2371)\xc2\xa0\n      at android.app.ActivityThread.access$800(ActivityThread.java:149)\xc2\xa0\n      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284)\xc2\xa0\n      at android.os.Handler.dispatchMessage(Handler.java:102)\xc2\xa0\n      at android.os.Looper.loop(Looper.java:135)\xc2\xa0\n      at android.app.ActivityThread.main(ActivityThread.java:5290)\xc2\xa0\n      at java.lang.reflect.Method.invoke(Native Method)\xc2\xa0\n      at java.lang.reflect.Method.invoke(Method.java:372)\xc2\xa0\n      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)\xc2\xa0\n      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)\xc2\xa0\n03-29 20:36:52.822 11326-11326/? I/Process: Sending signal. PID: 11326 SIG: 9\n
Run Code Online (Sandbox Code Playgroud)\n\n

LiteMap 片段

\n\n
package com.tremulant.phield;\n\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.google.android.gms.maps.CameraUpdateFactory;\nimport com.google.android.gms.maps.GoogleMap;\nimport com.google.android.gms.maps.OnMapReadyCallback;\nimport com.google.android.gms.maps.SupportMapFragment;\nimport com.google.android.gms.maps.model.LatLng;\nimport com.google.android.gms.maps.model.MarkerOptions;\n\npublic class LiteMap extends SupportMapFragment implements OnMapReadyCallback {\n    private GoogleMap mMap;\n\n    String lat;\n    String lng;\n    @Override\n    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {\n        //super.onCreate(savedInstanceState);\n        lat = getArguments().getString("Lat");\n        lng = getArguments().getString("Lng");\n        return inflater.inflate(R.layout.maplite,null);\n\n    }\n\n    @Override\n    public void onMapReady(GoogleMap googleMap) {\n        mMap = googleMap;\n\n        LatLng mapVenue = new LatLng(Double.parseDouble(lat), Double.parseDouble(lng));\n        mMap.addMarker(new MarkerOptions().position(mapVenue));\n        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(mapVenue, 14.0f));\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

片段的maplite.xml布局文件

\n\n
 <?xml version="1.0" encoding="utf-8"?>\n <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"\n          android:orientation="vertical"\n          android:layout_width="25dp"\n          android:layout_height="fill_parent"\n          android:weightSum="10">\n\n\n<fragment\n    android:id="@+id/lmap"\n    android:layout_width="match_parent"\n    android:layout_height="25dp"\n    class="com.tremulant.phield.LiteMap" />\n\n </LinearLayout>\n\n\n\n    package com.tremulant.phield;\n\nimport android.content.Intent;\nimport android.graphics.Typeface;\nimport android.os.Bundle;\nimport android.support.v7.widget.Toolbar;\nimport android.view.View;\nimport android.widget.Button;\nimport android.widget.TextView;\n\npublic class ReviewDetails extends BaseActivity implements View.OnClickListener{\n\nprivate Venue mVenue;\n@Override\npublic void onClick(View v) {\n    Intent mapIntent = new Intent(ReviewDetails.this, VenueMap.class);\n    mapIntent.putExtra(VENUE_TRANSFER,mVenue);\n    startActivity(mapIntent);\n}\n\n@Override\nprotected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n    setContentView(R.layout.activity_review_details);\n    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);\n    setSupportActionBar(toolbar);\n\n    getSupportActionBar().setDisplayHomeAsUpEnabled(true);\n\n    Intent intent = getIntent();\n    mVenue = (Venue) intent.getSerializableExtra(VENUE_TRANSFER);\n\n    LiteMap liteMap = new LiteMap();\n    //lmap.setArguments(args);\n    android.support.v4.app.FragmentTransaction fragmentTransaction =\n            getSupportFragmentManager().beginTransaction();\n    fragmentTransaction.add(R.id.map_container, liteMap);\n    fragmentTransaction.commit();\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

content_review_details.xml 布局文件

\n\n
<?xml version="1.0" encoding="utf-8"?>\n<RelativeLayout\nxmlns:android="http://schemas.android.com/apk/res/android"\nxmlns:app="http://schemas.android.com/apk/res-auto"\nxmlns:tools="http://schemas.android.com/tools"\nandroid:layout_width="match_parent"\nandroid:layout_height="match_parent"\nandroid:paddingBottom="@dimen/activity_vertical_margin"\nandroid:paddingLeft="@dimen/activity_horizontal_margin"\nandroid:paddingRight="@dimen/activity_horizontal_margin"\nandroid:paddingTop="@dimen/activity_vertical_margin"\napp:layout_behavior="@string/appbar_scrolling_view_behavior"\ntools:context="com.tremulant.phield.ReviewDetails"\ntools:showIn="@layout/activity_review_details">\n\n<FrameLayout\n    android:id="@+id/map_container"\n    android:layout_below="@id/map"\n    android:layout_width="match_parent"\n    android:layout_height="wrap_content">\n    </FrameLayout>\n\n </RelativeLayout>\n
Run Code Online (Sandbox Code Playgroud)\n\n

我简化了我的代码。另外,我不明白为什么当我将代码粘贴到此处时它没有正确缩进。啊!现在我的 logcat 循环显示以下内容。当 ReviewDetails 活动尝试加载时,屏幕保持黑色。

\n\n
03-30 20:58:28.364 17076-17076/com.tremulant.phield I/ViewRootImpl: \n\nViewRoot\'s Touch Event : ACTION_DOWN\n03-30 20:58:28.466 17076-17076/com.tremulant.phield I/ViewRootImpl: ViewRoot\'s Touch Event : ACTION_UP\n03-30 20:58:28.503 17076-17076/com.tremulant.phield I/Timeline: Timeline: Activity_launch_request id:com.tremulant.phield time:25955914\n03-30 20:58:28.552 17076-17076/com.tremulant.phield I/Timeline: Timeline: Activity_launch_request id:com.tremulant.phield time:25955964\n03-30 20:58:28.600 17076-17076/com.tremulant.phield D/ContextHelper: convertTheme. context->name=com.tremulant.phield themeResourceId=2131427455\n03-30 20:58:28.604 17076-17076/com.tremulant.phield D/ContextHelper: convertTheme. context->name=com.tremulant.phield themeResourceId=2131427455\n03-30 20:58:28.606 17076-17076/com.tremulant.phield I/PhoneWindow: [generateLayout] setColorNavigationBar => color=0x ff00796b\n03-30 20:58:28.753 17076-17076/com.tremulant.phield I/zzad: Making Creator dynamically\n03-30 20:58:28.763 17076-17076/com.tremulant.phield W/ResourcesManager: Asset path \'/system/framework/com.android.media.remotedisplay.jar\' does not exist or contains no resources.\n03-30 20:58:28.763 17076-17076/com.tremulant.phield W/ResourcesManager: Asset path \'/system/framework/com.android.location.provider.jar\' does not exist or contains no resources.\n03-30 20:58:28.839 17076-17076/com.tremulant.phield D/ChimeraCfgMgr: Reading stored module config\n03-30 20:58:28.878 17076-17076/com.tremulant.phield D/ChimeraFileApk: Primary ABI of requesting process is armeabi-v7a\n03-30 20:58:28.879 17076-17076/com.tremulant.phield I/art: DexFile_isDexOptNeeded failed to open oat file \'/data/dalvik-cache/arm/data@data@com.google.android.gms@app_chimera@m@00000000@DynamiteModules-prod.apk@classes.dex\' for file location \'/data/data/com.google.android.gms/app_chimera/m/00000000/DynamiteModules-prod.apk\': Failed to open oat filename for reading: No such file or directory\n03-30 20:58:28.880 17076-17076/com.tremulant.phield D/ChimeraFileApk: Classloading successful. Optimized code found.\n03-30 20:58:29.044 17076-17076/com.tremulant.phield I/Google\xc2\xa0Maps\xc2\xa0Android\xc2\xa0API: Google Play services client version: 8487000\n03-30 20:58:29.055 17076-17076/com.tremulant.phield I/Google\xc2\xa0Maps\xc2\xa0Android\xc2\xa0API: Google Play services package version: 8703230\n03-30 20:58:29.331 17076-17076/com.tremulant.phield I/Google\xc2\xa0Maps\xc2\xa0Android\xc2\xa0API: Google Play services package version: 8703230\n03-30 20:58:29.339 17076-17076/com.tremulant.phield I/Google\xc2\xa0Maps\xc2\xa0Android\xc2\xa0API: Google Play services package version: 8703230\n03-30 20:58:29.344 17076-17076/com.tremulant.phield I/Google\xc2\xa0Maps\xc2\xa0Android\xc2\xa0API: Google Play services package version: 8703230\n03-30 20:58:29.352 17076-17076/com.tremulant.phield I/Google\xc2\xa0Maps\xc2\xa0Android\xc2\xa0API: Google Play services package version: 8703230\n03-30 20:58:29.361 17076-17076/com.tremulant.phield I/Google\xc2\xa0Maps\xc2\xa0Android\xc2\xa0API: Google Play services package version: 8703230\n
Run Code Online (Sandbox Code Playgroud)\n

Ale*_*nin 5

如果您仍然需要答案:

将您的更改maplite.xml为:

<RelativeLayout
    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:layout_width="match_parent"
    android:layout_height="25dp">

    <fragment
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        class="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

扩展android.support.v4.app.Fragment而不是SupportMapFragment在您的LiteMap片段中。

onCreateView在你的片段放置之后MapLite

@Override
public void onResume() {
    super.onResume();

    SupportMapFragment smf = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map));

    smf.getMapAsync(this);
}
Run Code Online (Sandbox Code Playgroud)

  • 没有回答原始问题如何扩展SupportMapFragment。 (2认同)