1

我只是想按照 android dev 上的示例代码来为活动中的片段充气。我有一个更复杂的项目我正在工作,但我在这里遇到了与这个简单项目相同的错误。谁能指出我正确的方向?

扩展片段的类

package com.example.fragtest;


import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class FragOne extends Fragment {

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
    }
    @Override
    public View onCreateView(LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState){
        return inflater.inflate(R.layout.activity_main, container,false);
    }

}

扩展 FragmentActivity 的类

package com.example.fragtest;

import android.os.Bundle;
import android.view.Menu;
import android.support.v4.app.FragmentActivity;

public class MainActivity extends FragmentActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }



}

片段所在的xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

   <fragment android:name="com.example.fragtest.FragOne"
       android:id="@+id/frag"
       android:layout_width="match_parent"
       android:layout_height="match_parent" />

</LinearLayout>

设置活动名称的清单

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.fragtest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="11"
        android:targetSdkVersion="15" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

这是logcat的输出

07-17 23:45:09.053: E/AndroidRuntime(560): FATAL EXCEPTION: main
07-17 23:45:09.053: E/AndroidRuntime(560): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.fragtest/com.example.fragtest.MainActivity}: android.view.InflateException: Binary XML file line #7: Error inflating class fragment
07-17 23:45:09.053: E/AndroidRuntime(560):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
07-17 23:45:09.053: E/AndroidRuntime(560):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
07-17 23:45:09.053: E/AndroidRuntime(560):  at android.app.ActivityThread.access$600(ActivityThread.java:122)
07-17 23:45:09.053: E/AndroidRuntime(560):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
07-17 23:45:09.053: E/AndroidRuntime(560):  at android.os.Handler.dispatchMessage(Handler.java:99)
07-17 23:45:09.053: E/AndroidRuntime(560):  at android.os.Looper.loop(Looper.java:137)
07-17 23:45:09.053: E/AndroidRuntime(560):  at android.app.ActivityThread.main(ActivityThread.java:4340)
07-17 23:45:09.053: E/AndroidRuntime(560):  at java.lang.reflect.Method.invokeNative(Native Method)
07-17 23:45:09.053: E/AndroidRuntime(560):  at java.lang.reflect.Method.invoke(Method.java:511)
07-17 23:45:09.053: E/AndroidRuntime(560):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
07-17 23:45:09.053: E/AndroidRuntime(560):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
07-17 23:45:09.053: E/AndroidRuntime(560):  at dalvik.system.NativeStart.main(Native Method)
07-17 23:45:09.053: E/AndroidRuntime(560): Caused by: android.view.InflateException: Binary XML file line #7: Error inflating class fragment
07-17 23:45:09.053: E/AndroidRuntime(560):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:697)
07-17 23:45:09.053: E/AndroidRuntime(560):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:739)
07-17 23:45:09.053: E/AndroidRuntime(560):  at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
07-17 23:45:09.053: E/AndroidRuntime(560):  at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
07-17 23:45:09.053: E/AndroidRuntime(560):  at com.example.fragtest.FragOne.onCreateView(FragOne.java:18)
07-17 23:45:09.053: E/AndroidRuntime(560):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:846)
07-17 23:45:09.053: E/AndroidRuntime(560):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1061)
07-17 23:45:09.053: E/AndroidRuntime(560):  at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1160)
07-17 23:45:09.053: E/AndroidRuntime(560):  at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:272)
07-17 23:45:09.053: E/AndroidRuntime(560):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:669)
07-17 23:45:09.053: E/AndroidRuntime(560):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:739)
07-17 23:45:09.053: E/AndroidRuntime(560):  at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
07-17 23:45:09.053: E/AndroidRuntime(560):  at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
07-17 23:45:09.053: E/AndroidRuntime(560):  at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
07-17 23:45:09.053: E/AndroidRuntime(560):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:251)
07-17 23:45:09.053: E/AndroidRuntime(560):  at android.app.Activity.setContentView(Activity.java:1835)
07-17 23:45:09.053: E/AndroidRuntime(560):  at com.example.fragtest.MainActivity.onCreate(MainActivity.java:12)
07-17 23:45:09.053: E/AndroidRuntime(560):  at android.app.Activity.performCreate(Activity.java:4465)
07-17 23:45:09.053: E/AndroidRuntime(560):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
07-17 23:45:09.053: E/AndroidRuntime(560):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
07-17 23:45:09.053: E/AndroidRuntime(560):  ... 11 more
07-17 23:45:09.053: E/AndroidRuntime(560): Caused by: java.lang.IllegalArgumentException: Binary XML file line #7: Duplicate id 0x7f080000, tag null, or parent id 0x0 with another fragment for com.example.fragtest.FragOne
07-17 23:45:09.053: E/AndroidRuntime(560):  at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:277)
07-17 23:45:09.053: E/AndroidRuntime(560):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:669)
07-17 23:45:09.053: E/AndroidRuntime(560):  ... 30 more
4

4 回答 4

7

在您的扩展类中,FragmentActivity您将视图设置为一个名为activity_main. 在activity_main您的内部有对您的片段代码的引用,com.example.fragtest.FragOne. 加载该 XML 时,将执行与之关联的代码com.example.fragtest.FragOne。该Fragment的代码返回一个带有R.id.activity_main.

该 XML 文件引用了刚刚实例化它的同一片段代码。你看到了难题。

要解决您的问题实例,请在Fragment类中创建一个新的 XML 文件(未命名的文件activity_main) 。而不是膨胀一个单独的 XML(一个不包含对调用它的代码的引用)。实际上应该是容器,这个新布局(例如)将是 UI 部分。activity_mainactivity_mainfragment_layout

我喜欢这样想:尽管有教义,但Fragment包含三个部分。容器Activity(这可以,并且在您的情况下应该通过 setContentView 膨胀布局 XML 文件),Fragment的 java 代码(这可以并且在您的情况下应该膨胀布局...。除了 之外的东西activity_main),并且Fragment的关联 XML 文件(由您的 Fragment 类膨胀的文件,不包括对其代码的循环引用)。

当然,这些咒语有漏洞,但你明白了吗?

于 2012-07-18T02:18:53.817 回答
1

android:id="@+id/frag"

您的 logcat 表明您的片段 id 是另一个的副本。您是否有任何其他具有相同 ID 的 XML 元素?如果没有,您是否尝试过清理您的项目?

Project->Clean...
于 2012-07-17T23:53:50.720 回答
1

检查您的片段类,它正在膨胀 activity_main xml 文件,这是错误的,它应该膨胀您的片段的 xml 文件。

于 2015-01-27T05:15:26.597 回答
0

我有同样的问题 。在我的 xml 我创建视图而不是视图

所以需要改变

<view
          android:layout_width="match_parent"
          android:layout_height="1dp"
          android:layout_marginTop="20.7dp"
          android:textColor="@color/silver_two"
         />

<View
          android:layout_width="match_parent"
          android:layout_height="1dp"
          android:layout_marginTop="20.7dp"
          android:textColor="@color/silver_two"
         />
于 2017-01-15T12:55:31.220 回答