【发布时间】:2017-03-20 05:38:56
【问题描述】:
需要一些帮助。
我正在开发一个小型 Android 应用程序,它从 URI 获取 JSON 数据,并将找到的任何活动 Cyclones 添加到列表中并显示它。一切正常。
我决定在应用中放置一个 Fragment 来显示 Google 地图。我根本没有使用过 Fragments,这就是麻烦的开始。
这是来自 MainActivity.java 的 onCreate
代码
public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<List<CycloneData>>
我会删掉大部分不适用的代码。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.cyclone_list);
...
//cutting code above, out to simplify
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
CycloneMap mapFrag = new CycloneMap();
fragmentTransaction.add(R.id.google_map, mapFrag);
fragmentTransaction.replace(R.id.google_map, mapFrag);
fragmentTransaction.commit();
}
这是来自我的片段类“CycloneMap.java”。我认为问题出在 onCreateView Inflater .... 但我无法弄清楚是什么/为什么。我也可能对此非常错误。
代码
public class CycloneMap extends Fragment implements OnMapReadyCallback {
//Defining Google Map objects variables
GoogleMap mMap;
boolean mapReady=false;
static final CameraPosition START_POINT = CameraPosition.builder()
.target(new LatLng(38.1254, -101.1703))
.zoom(3)
.bearing(340)
.tilt(15)
.build();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.activity_main, container, false);
}
@Override
//onMapReady CallBack method
public void onMapReady(GoogleMap map) {
//Setting mapReady to true
mapReady=true;
//Loading local instance map from Callback
mMap = map;
//Set camera at starting point, high over the middle of the U.S of A.
initialCameraPosition(START_POINT);
}
private void initialCameraPosition(CameraPosition target) {
//Setting position to the target created above
mMap.moveCamera(CameraUpdateFactory.newCameraPosition(target));
}
还有我的 activity_main.xml 布局(是的....它很丑:))
XML
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:orientation="vertical"
tools:context="com.palarran.cycloops.MainActivity">
<LinearLayout
android:id="@+id/list_layout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:isScrollContainer="true"
>
<TextView
android:id="@+id/storm_category"
android:layout_width="46dp"
android:layout_height="46dp"
android:layout_gravity="center_vertical"
android:background="@drawable/cyclone_shape"
android:fontFamily="sans-serif-medium"
android:gravity="center"
android:textColor="@android:color/black"
android:textSize="20sp"
tools:text="5"/>
<LinearLayout
android:id="@+id/clickable_info"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="16dp"
android:layout_marginStart="16dp"
android:layout_weight="1"
android:background="?android:attr/selectableItemBackground"
android:orientation="vertical">
<TextView
android:id="@+id/storm_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:fontFamily="sans-serif-medium"
android:maxLines="1"
android:textAllCaps="true"
android:textColor="@color/textColorCycloneName"
android:textSize="16sp"
tools:text="Fred"/>
<TextView
android:id="@+id/direction"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:textColor="@color/textColorCycloneHeading"
android:textSize="16sp"
tools:text="Heading 270 degrees W"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="16dp"
android:layout_marginStart="16dp"
android:orientation="vertical">
<TextView
android:id="@+id/wind_speed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:textColor="@color/textColorCycloneName"
android:textSize="16sp"
tools:text="75"/>
<TextView
android:id="@+id/distance"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:textColor="@color/textColorCycloneName"
android:textSize="12sp"
tools:text="125 miles E"/>
</LinearLayout>
</LinearLayout>
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_below="@id/list_layout"
android:id="@+id/fragment_layout">
<fragment
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/google_map"
android:name="com.palarran.cycloops.CycloneMap"
class="com.palarran.cycloops.CycloneMap"
android:layout_width="match_parent"
android:layout_height="fill_parent"/>
</FrameLayout>
LogCat 说:
错误
E/AndroidRuntime: 致命异常: main 进程:com.palarran.cycloops,PID:25336 java.lang.RuntimeException:无法启动活动 ComponentInfo{com.palarran.cycloops/com.palarran.cycloops.MainActivity}:java.lang.IllegalArgumentException:未找到 id 0x7f0e0013 (com.palarran.cycloops:id/google_map) 的视图对于片段 CycloneMap{95502b #0 id=0x7f0e0013} 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6119) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 原因:java.lang.IllegalArgumentException:没有为片段 CycloneMap{95502b #0 id=0x7f0e0013} 找到 id 0x7f0e0013 (com.palarran.cycloops:id/google_map) 的视图 在 android.app.FragmentManagerImpl.moveToState(FragmentManager.java:987) 在 android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1171) 在 android.app.BackStackRecord.run(BackStackRecord.java:816) 在 android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1578) 在 android.app.FragmentController.execPendingActions(FragmentController.java:371) 在 android.app.Activity.performStart(Activity.java:6695) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2628) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6119) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
应该给我答案的部分错误:
java.lang.IllegalArgumentException:未找到片段 CycloneMap{95502b #0 id=0x7f0e0013} 的 id 0x7f0e0013 (com.palarran.cycloops:id/google_map) 的视图
很抱歉把这个转嫁给大家。我得到的大部分内容来自Android Dev Fragments
还有这么多 StackOverFlow 问题与排序相同的问题。但是没有运气,所以,我崩溃并寻求帮助。
据我了解,我应该能够将此或任何 Fragment 放入 Activity 并使用它运行。还是我误会了?
我在 Manifest 中的 API 密钥和权限都可以使用。我已经多次清理并重建了这个项目。但我会包括清单,以防我错过了什么
清单
<?xml version="1.0" encoding="utf-8"?>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher_cycloops"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name=".MenuSettingsActivity"
android:label="@string/settings_title">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.palarran.cycloops.MenuSettingsActivity"/>
</activity>
<activity android:name=".CycloneMap"/>
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="AIzaSyC9d4qOHlPW4MnrEde3ucDOVrPzyvN1qBs"/>
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version"/>
</application>
谢谢, CB...
【问题讨论】:
-
您发布了
CycloneMapFragment extends Fragment的代码。你有另一个名为CycloneMap的片段吗?然后也发布。 -
SORRY....那是我没有捕捉到的重构....CycloneMap 是 Fragment....没有 CycloneMapFragment....编辑以纠正这个....
-
R.layout.cyclone_list是 Activity 布局,对吧?而R.layout.activity_main是片段布局? -
这也是我认为我可能会搞砸的地方。 R.layout.activity_main 是主要的 Activity 布局。 R.layout.cyclone_list 是一个布局,用于保存从 JSON 数据创建的列表。
标签: android google-maps android-fragments