这与几个帖子有关,但我没有看到任何解释视图层次结构中视图创建顺序的内容(static - xml和dynamic - in code)。
我有一个托管活动和片段的FragmentActivity。在调用片段的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)
my java file snippets:
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 /布局/ 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错误的可能原因:
我检查过,我的xml文件都在那里。也许有语法错误或缺少链接资源,但我看不到它。我理解HierarchyViewer是一个调试UI的有用工具,但是我无法让它工作。
我的FragmentActivity的onCreate @覆盖 public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); 的setContentView(R.layout.activity_fragments_main);
my Fragment的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
答案 0 :(得分:0)
activty_fragments_main中的TextView
没有ID。我遇到了类似的错误,并添加了一个id,突然间事情开始起作用......
答案 1 :(得分: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>
答案 2 :(得分:0)
在 FragmentMainActivity 中,您要将片段添加到 id streamingactivity
fragmentTransaction.add(R.id.streamingactivity, streamingActivity);
和&#34; activity_fragments_main.xml&#34;我的FragmentMainActivity
<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>
//你的布局必须包含一个id为streamingactivity的FrameLayout。你的活动必须包含
<FrameLayout
android:id="@+id/streamingactivity"
....
..>
StreamingActivity
Fragment
必须导入android.support.v4.Fragment
。并且必须实施onCreateView
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.main, container, false);
}
或者还有一个问题。您已经交换了片段和活动的LayoutId 。正如你的名字一样