android - 以编程方式添加多个 fragment

标签 android android-fragments

关于项目的简短信息:

  • minSDK = 8
  • 导入android.support.v4

部分类代码:

public class DetailsActivity extends FragmentActivity implements ToplineTrigger {

static Context mContext;

private static FragmentManager fm;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.details);
    if (mContext == null)
        mContext = Pleazzme.getAppContext();

    DetailsTitleFragment title = new DetailsTitleFragment();
    DocumentDescriptionWeb description = new DocumentDescriptionWeb();
    getSupportFragmentManager()
            .beginTransaction()
            .add(R.id.detailstitlefragment_wrap, title, "DetailsTitle")
            .add(R.id.documentdescriptionweb_wrap, description, "WebDescription")
            .commit();

    ((Topline) fm.findFragmentByTag("Topline")).setDetailsMode();
};

XML View :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/details_contentwrapper"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="vertical" >

<fragment
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    class="com.mtechnologia.pleazzme.Topline"
    android:tag="Topline" />

<FrameLayout
    android:id="@+id/detailstitlefragment_wrap"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >
</FrameLayout>

<FrameLayout
    android:id="@+id/documentdescriptionweb_wrap"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >
</FrameLayout>
</LinearLayout>

类声明:

public class DetailsTitleFragment extends ListFragment{...}

public class DocumentDescriptionWeb extends Fragment {

WebView mWebView = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

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

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    mWebView = (WebView) view.findViewById(R.id.simplewebview);
    mWebView.getSettings().setJavaScriptEnabled(false);
    mWebView.getSettings().setSupportZoom(false);

    String data = "asdasdasd";
    mWebView.loadData(data, "text/html", "utf-8");
}

}  

代码运行后出现错误:

08-15 19:11:08.003: E/AndroidRuntime(24708): FATAL EXCEPTION: main
08-15 19:11:08.003: E/AndroidRuntime(24708): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mtechnologia.pleazzme/com.mtechnologia.pleazzme.DetailsActivity}: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
08-15 19:11:08.003: E/AndroidRuntime(24708):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1967)
08-15 19:11:08.003: E/AndroidRuntime(24708):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992)
08-15 19:11:08.003: E/AndroidRuntime(24708):    at android.app.ActivityThread.access$600(ActivityThread.java:127)
08-15 19:11:08.003: E/AndroidRuntime(24708):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158)
08-15 19:11:08.003: E/AndroidRuntime(24708):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-15 19:11:08.003: E/AndroidRuntime(24708):    at android.os.Looper.loop(Looper.java:137)
08-15 19:11:08.003: E/AndroidRuntime(24708):    at android.app.ActivityThread.main(ActivityThread.java:4511)
08-15 19:11:08.003: E/AndroidRuntime(24708):    at java.lang.reflect.Method.invokeNative(Native Method)
08-15 19:11:08.003: E/AndroidRuntime(24708):    at java.lang.reflect.Method.invoke(Method.java:511)
08-15 19:11:08.003: E/AndroidRuntime(24708):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
08-15 19:11:08.003: E/AndroidRuntime(24708):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
08-15 19:11:08.003: E/AndroidRuntime(24708):    at dalvik.system.NativeStart.main(Native Method)
08-15 19:11:08.003: E/AndroidRuntime(24708): Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
08-15 19:11:08.003: E/AndroidRuntime(24708):    at android.view.ViewGroup.addViewInner(ViewGroup.java:3342)
08-15 19:11:08.003: E/AndroidRuntime(24708):    at android.view.ViewGroup.addView(ViewGroup.java:3213)
08-15 19:11:08.003: E/AndroidRuntime(24708):    at android.view.ViewGroup.addView(ViewGroup.java:3170)
08-15 19:11:08.003: E/AndroidRuntime(24708):    at android.view.ViewGroup.addView(ViewGroup.java:3150)
08-15 19:11:08.003: E/AndroidRuntime(24708):    at android.support.v4.app.NoSaveStateFrameLayout.wrap(NoSaveStateFrameLayout.java:40)
08-15 19:11:08.003: E/AndroidRuntime(24708):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:875)
08-15 19:11:08.003: E/AndroidRuntime(24708):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1083)
08-15 19:11:08.003: E/AndroidRuntime(24708):    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:635)
08-15 19:11:08.003: E/AndroidRuntime(24708):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1431)
08-15 19:11:08.003: E/AndroidRuntime(24708):    at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:523)
08-15 19:11:08.003: E/AndroidRuntime(24708):    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1136)
08-15 19:11:08.003: E/AndroidRuntime(24708):    at android.app.Activity.performStart(Activity.java:4480)
08-15 19:11:08.003: E/AndroidRuntime(24708):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1940)
08-15 19:11:08.003: E/AndroidRuntime(24708):    ... 11 more  

谁能告诉我,我做错了什么?
我知道,我可以在 XML 中声明这两个 fragment ,但我需要以编程方式添加这些 fragment ,以便在需要时替换它们。 预先感谢您的帮助

最佳答案

你需要改变

inflater.inflate(R.layout.simplewebview, container);

inflater.inflate(R.layout.simplewebview, container, false);

将该属性设置为 false 将确保 View 与从 View 传入的父容器分离。从 onCreateView() 返回的 View 不能附加到父级,因为它很快就会被系统本身添加到容器中。

关于android - 以编程方式添加多个 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11973016/

相关文章:

javascript - java.lang.RuntimeException : Requested enabled DevSupportManager, 但未找到或无法创建 DevSupportManagerImpl 类

android - 计算2天android之间的时差

android - 如何在android中清除Fragment backstack

替换 fragment 时Android适合SystemWindows不起作用

android - android广播接收器中的竞争条件?

android - 在 Android 中跟踪 opengl 纹理内存

android - 如何在 VR 视频上叠加 "play button"?

android - 我应该隐藏可选 View 还是在运行时添加它们?

java - 我无法从 Activity 中填充 fragment 中的回收 View

java - 如何将 fragment 设置为 BottomNavigation 的默认 fragment ?