首页 文章

在调用onCreateView()之前,“找不到用于片段的id的视图”错误

提问于
浏览
1

这与几个帖子有关,但我没有看到任何解释视图层次结构中视图创建顺序的内容(static - xml和dynamic - in code) .

我有一个FragmentActivity托管一个Activity和一个片段 . 在调用片段的onCreateView之前,我从没有为片段创建的视图中收到运行时错误 . 由于调试器似乎无法在步进过程中找到正确的行号,因此很难确定无法找到视图的调用方法 .

我无法正确连接源以查看FragmentManager内部,因为dl'd源和.jar之间似乎不匹配

我在StreamingActivity.onCreateView中放置了一个Log.i条目,之前发生了错误 .

这是相关的LogCat:

07-19 10:13:36.091: I/StreamingActivity(9886): onCreate
07-19 10:13:42.271: W/dalvikvm(9886): threadid=1: thread exiting with uncaught exception (group=0x40020560)
07-19 10:13:42.281: E/AndroidRuntime(9886): FATAL EXCEPTION: main
07-19 10:13:42.281: E/AndroidRuntime(9886): java.lang.RuntimeException: Unable to start activity   
ComponentInfo{kesten.fragmentstestbed/kesten.fragmentstestbed.FragmentsMainActivity}:        
java.lang.IllegalArgumentException: No view found for id 0x7f05002e for fragment 
StreamingActivity{4052f810 #0 id=0x7f05002e}
caused by
java.lang.IllegalArgumentException: No view found for id 0x7f05002e for fragment 
StreamingActivity{40530948 #0 id=0x7f05002e}
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:865)

我的java文件片段:

public class FragmentsMainActivity extends FragmentActivity {

public final static int STARTUP_ACTIVITY_RESULT=0;

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

    if(savedInstanceState == null) {
        Intent intentStartupActivity = new Intent(this, StartupActivity.class);
        if(intentStartupActivity != null)
            startActivityForResult(intentStartupActivity, STARTUP_ACTIVITY_RESULT);

        // get an instance of FragmentTransaction from your Activity
        FragmentTransaction fragmentTransaction = 
                getSupportFragmentManager().beginTransaction();

        //add a fragment
        StreamingActivity streamingActivity = new StreamingActivity();
        if (streamingActivity != null) {
            fragmentTransaction.add(R.id.streamingactivity, streamingActivity);
            fragmentTransaction.commit();
        }
    }
}

我的碎片:

public class StreamingActivity extends Fragment {

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.i("StreamingActivity","onCreate")   
}

我的布局文件:“res / layout / main.xml”

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

    <FrameLayout
    android:id="@+id/streamingactivity"
    android:layout_width="0px"
    android:layout_height="match_parent">
</FrameLayout>


<!-- IMU -->
<TextView
    android:id="@+id/imu_label"
    style="@style/Label.Title"
    android:text="@string/imu"
    />

<kesten.fragmentstestbed.ImuView
    android:id="@+id/imu_values"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/imu_label"
    android:text=""
    />

<!-- Accelerometer -->
<TextView
    android:id="@+id/accelerometer_label"
    style="@style/Label.Title"
    android:text="@string/accelerometer"
    android:layout_below="@+id/imu_values"
    />

<!-- Filtered -->
<kesten.fragmentstestbed.CoordinateView
    android:id="@+id/accelerometer_filtered_coordinates"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/accelerometer_label"
    android:text="@string/filtered"
    />

</RelativeLayout>

和FragmentActivity的“activity_fragments_main.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="match_parent" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:padding="@dimen/padding_medium"
        android:text="@string/hello_world"
        tools:context=".FragmentsMainActivity" />

</RelativeLayout>

从其他Stackoverflow线程收集的可能的id not found错误原因:

在FragmentActivity的onCreate()方法的setContentView()中

  • 错误的布局 .

我检查过,我的xml文件都在那里 . 也许有语法错误或缺少链接资源,但我看不到它 . 我理解HierarchyViewer将是一个调试UI的有用工具,但我不能让它工作 .

  • 传入FragmentTransaction.add的id必须是setContentView中指定的布局的子级 .

我的FragmentActivity的onCreate @Override public void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);的setContentView(R.layout.activity_fragments_main);

我的片段是onCreateView

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    Log.i("StreamingActivity","onCreateView");      
    View view = inflater.inflate(R.layout.main, container, false);

我假设LayoutManager传递了容器的正确值,即FragmentActivity的setContentView()中设置的值 . 但无论如何我们从来没有在那里 . logCat中的错误发生在我们进入onCreateView()之前 .

我唯一可以想到的是,在setContentView之后和StreamingActivity之前调用的startupActivity(封闭的第三方)将内容视图设置为除了R.layout.activity_fragments_main之外的其他内容,而不是我的片段视图的父节点 .

这个问题似乎源于这样一个事实:虽然Activity有setContentView可以随时调用,但Fragment只有onCreateView(),它在启动片段的片段事务之后被调用 .

在调用onCreateView()之前,为什么以及尝试访问片段的视图?

darKoram

3 回答

  • 0

    activty_fragments_main中的 TextView 没有id . 我遇到了类似的错误,并添加了一个id,突然间事情开始起作用......

  • 0

    以下 FrameLayout 应该在 activty_fragments_main

    <FrameLayout
        android:id="@+id/streamingactivity"
        android:layout_width="0px"
        android:layout_height="match_parent">
    </FrameLayout>
    

    下面的函数在第一个aurgument中提供的布局中添加一个片段:

    fragmentTransaction.add(R.id.streamingactivity, streamingActivity);
    

    所以尝试改变:

    <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="match_parent" >
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:padding="@dimen/padding_medium"
            android:text="@string/hello_world"
            tools:context=".FragmentsMainActivity" />
    
    </RelativeLayout>
    

    至:

    <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="match_parent" >
    
    
       <FrameLayout
        android:id="@+id/streamingactivity"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </FrameLayout>
    
    </RelativeLayout>
    
  • 0

    在FragmentMainActivity中,您要将片段添加到id streamingactivity

    fragmentTransaction.add(R.id.streamingactivity, streamingActivity);
    

    和我的FragmentMainActivity的“activity_fragments_main.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="match_parent" >
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:padding="@dimen/padding_medium"
            android:text="@string/hello_world"
            tools:context=".FragmentsMainActivity" />
    
    </RelativeLayout>
    

    //你的布局必须包含一个带有流媒体活动的FrameLayout . 你的活动必须包含

    <FrameLayout 
    android:id="@+id/streamingactivity"
    ....
    ..>
    

    你的StreamingActivity是一个片段必须导入android.support.v4.Fragment . 并且必须实现onCreateView

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

    或者还有一个问题 . 你有 interchanged the LayoutId of Fragment and Activity . 正如你的名字一样

相关问题