【问题标题】:Android, Fragments, Google Map: Error IllegalArgumentException: No view found for id --- for fragmentAndroid, Fragments, Google Map: Error IllegalArgumentException: No view found for id --- for fragment
【发布时间】: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


【解决方案1】:

我希望在R.layout.cyclon_list中,有一个id为google_map的容器。现在,在CycloneMap 片段中,您正在设置return inflater.inflate(R.layout.activity_main, container, false);
但是查看布局 activity_main,

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

您在片段内引用相同的片段类。为什么会这样?声明class="com.palarran.cycloops.CycloneMap" 将在内部片段中再次重新创建整个片段。这将继续循环。
如果您需要内部片段,请使用具有另一个布局的另一个类。或者,您可以只在布局内提供容器,稍后通过代码添加片段,就像在活动中所做的那样。

CycloneMap mapFrag = new CycloneMap();
fragmentTransaction.add(R.id.fragment_layout, mapFrag);
fragmentTransaction.commit();

【讨论】:

  • 啊,好的。灯光缓缓亮起。我误解了文档。我想当我添加容器 时,我必须将 放在 XML 布局中的容器内。你的回答帮助我意识到我的错误。片段仍未完全加载,但我不再收到原始错误。我的 CycloneMap.java 片段中需要更多代码,片段应该可以正常工作。将根据您的建议更新我的问题。
【解决方案2】:

首先,在你的 AndroidManifest.xml 文件中,

<activity android:name=".CycloneMap"/> // according to the code you have posted, CycloneMap is a fragment, so please remove this line

其次,在替换或添加片段时,您需要传递包含片段的容器的id(在您的情况下,它是FrameLayout的id),如下所示:

    CycloneMap mapFrag = new CycloneMap();
    fragmentTransaction.add(R.id.fragment_layout, mapFrag);
    fragmentTransaction.replace(R.id.fragment_layout, mapFrag);
    fragmentTransaction.commit();

最后但并非最不重要的一点是,请确保您已为相应的活动设置正确的布局。例如,您已将 MainActivity 中的 cyclone_list 设置为内容视图。但是,我没有在您的代码中看到任何此类布局。

setContentView(R.layout.cyclone_list); // it should be activity_main

【讨论】:

  • 清单已更改。那应该被注释掉了。我之前也尝试过使用 R.id.fragment_layout 但得到了同样的错误。我相信问题在于你的第三个建议。将 setContentView 更改为 R.layout.acivity_main 会破坏应用程序的其余部分。将 Github 上的分支链接发布到上面的主要问题。
【解决方案3】:

非常感谢 Nizam。

为纠正错误所做的更改:

代码从我删除的activity_main.xml

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

然后将以下内容添加到 cyclone_list.xml

代码

<FrameLayout
        android:id="@+id/google_map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"/>

在 MainActivity.java 我改变了

CycloneMap mapFrag = new CycloneMap();
fragmentTransaction.add(R.id.google_map, mapFrag);
fragmentTransaction.replace(R.id.google_map, mapFrag);
fragmentTransaction.commit();

CycloneMap mapFrag = new CycloneMap();
    fragmentTransaction.add(R.id.google_map, mapFrag);
    fragmentTransaction.commit();

最后在 CycloneMap.java Fragment 我改变了

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                     Bundle savedInstanceState) {
return inflater.inflate(R.layout.activity_main, container, false);

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.cyclone_list, container, false);
}

片段仍未加载...但我相信我走在正确的轨道上,有关错误的问题已得到解答和解决。我将继续努力让 Google 地图片段正常工作。它现在至少正在尝试加载到正确的位置。

谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    相关资源
    最近更新 更多