我需要替换Fragment一个Activity与另一个Fragment,下面是层文件Activity:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/home_layout_container">
<fragment android:name="com.foo.FragA"
android:id="@+id/home_list"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</FrameLayout>
Run Code Online (Sandbox Code Playgroud)
所以默认情况下有FragA,现在我想在活动中用FragB替换它,我做了:
public void onRegionClicked(Region region) {
RegionInfoFragment rif = RegionInfoFragment.newInstance(region);
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.home_list, rif);
}
Run Code Online (Sandbox Code Playgroud)
但我得到了例外:
>6:24:40.685: ERROR/AndroidRuntime(9194): Uncaught handler: thread main exiting due to uncaught exception
05-06 16:24:40.692: ERROR/AndroidRuntime(9194): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
05-06 16:24:40.692: ERROR/AndroidRuntime(9194): …Run Code Online (Sandbox Code Playgroud) 我有一个ListFragment显示用户创建的项目列表.我有一个ListView它的id设置为"@android:id/list"和一个TextViewid为"@android:id/empty".
我有一个操作栏按钮来显示片段,以允许用户为列表创建更多条目.这是onOptionsItemSelected()方法:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Fragment frag = null;
// Right now I only have code for the addCourse() fragment, will add more soon
switch (item.getItemId()) {
case R.id.addCourse:
frag = new AddCourseFragment();
break;
default:
return super.onOptionsItemSelected(item);
}
// The support library is being dumb and replace isn't actually
getFragmentManager().beginTransaction()
.remove(this).add(getId(), frag).addToBackStack(null).commit();
return true;
}
Run Code Online (Sandbox Code Playgroud)
AddCourseFragment代码如下:
public class AddCourseFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, …Run Code Online (Sandbox Code Playgroud) 我在Activity中有以下代码,它启动包含片段的布局的对话框.
...
case R.id.pick_resource:
dialog = new Dialog(this);
dialog.setContentView(R.layout.resource_picker);
dialog.setCancelable(true);
dialog.setTitle("Pick a resource");
dialog.show();
Run Code Online (Sandbox Code Playgroud)
这在应用程序启动后第一次运行得非常好,但是当对话框退出并稍后再次调用时,我得到了这个堆栈跟踪:
08-10 10:47:33.990: ERROR/AndroidRuntime(26521): FATAL EXCEPTION: main
android.view.InflateException: Binary XML file line #7: Error inflating class fragment
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:688)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:724)
at android.view.LayoutInflater.inflate(LayoutInflater.java:479)
at android.view.LayoutInflater.inflate(LayoutInflater.java:391)
at android.view.LayoutInflater.inflate(LayoutInflater.java:347)
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:224)
at android.app.Dialog.setContentView(Dialog.java:449)
at org.rhq.pocket.StartActivity.onOptionsItemSelected(StartActivity.java:118)
at android.app.Activity.onMenuItemSelected(Activity.java:2390)
at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:852)
at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:153)
at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:956)
at com.android.internal.view.menu.ActionMenuView.invokeItem(ActionMenuView.java:174)
at com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:85)
at android.view.View.performClick(View.java:3100)
at android.view.View$PerformClick.run(View.java:11644)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:126)
at android.app.ActivityThread.main(ActivityThread.java:3997)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:491)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) …Run Code Online (Sandbox Code Playgroud)