在Android应用中动态加载片段时出错

时间:2011-09-10 16:14:58

标签: android dynamic fragment switching

我正在尝试基于Android API FragmentLayout创建一个简单的应用程序。我希望能够在我创建的一组扩展Fragment类的类之间切换,而不是更改简单的TextView。

我可以在layout.xml文件中静态创建我的任何示例,Fragment运行我想要的方式。我已经读过您无法替换以这种方式创建的片段,因此示例应用程序似乎相关,因为它动态加载详细信息文本。主要区别在于我不想只创建一个新的通用Fragment,我从文件中加载一些文本,我想加载整个类文件(同样,它们是Fragments本身并包含自己的SurfaveViews)。

这是我的布局

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

    <fragment class="com.android.app.Examples$TitlesFragment"
        android:id="@+id/titles" android:layout_weight="1"
        android:layout_width="0px" android:layout_height="match_parent" />

    <FrameLayout android:id="@+id/fragment_to_switch_dynamically" android:layout_weight="1"
        android:layout_width="0px" android:layout_height="match_parent"
        android:background="?android:attr/detailsElementBackground" />

</LinearLayout>

以下是我尝试创建和更新的活动的相关方法

    void showDetails(int index) {
        mCurCheckPosition = index;

        if (mDualPane) {
            // We can display everything in-place with fragments, so update
            // the list to highlight the selected item and show the data.
            getListView().setItemChecked(index, true);

            if (mShownCheckPosition != mCurCheckPosition) {
                // If we are not currently showing a fragment for the new
                // position, we need to create and install a new one.
                PApplet pa = getProcessingSketchByIndex(index);

                // Execute a transaction, replacing any existing fragment
                // with this one inside the frame.
                FragmentTransaction ft = getFragmentManager()
                        .beginTransaction();
                ft.replace(R.id.processing, pa);
                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                ft.commit();
                mShownCheckPosition = index;
            }

        } else {
            // Otherwise we need to launch a new activity to display
            // the dialog fragment with selected text.
            // Intent intent = new Intent();
            // intent.setClass(getActivity(), DetailsActivity.class);
            // intent.putExtra("index", index);
            // startActivity(intent);
        }
    }

    private PApplet getProcessingSketchByIndex(int index) {
        PApplet pa = null;
        switch (index) {
        case 0:
            pa = new Lights1();
            break;
        case 1:
            pa = new Lights2();
            break;
        case 2:
            pa = new Reflection();
            break;
        case 3:
            pa = new Rotate();
            break;
        case 4:
            pa = new Spot();
            break;
        case 5:
            break;
        default:
            break;
        }
        return pa;
    }
}

一切似乎都很顺利然后我得到了这个错误 :

E/AndroidRuntime(31393): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.processing.app/com.android.processing.app.ProcessingExamples}:  java.lang.IllegalArgumentException: No view found for id 0x7f050001 for fragment  Lights1{407bf678 #1 id=0x7f050001}
    E/AndroidRuntime(31393):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1815)
    E/AndroidRuntime(31393):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1831)
    E/AndroidRuntime(31393):    at android.app.ActivityThread.access$500(ActivityThread.java:122)
    E/AndroidRuntime(31393):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1024)
    E/AndroidRuntime(31393):    at android.os.Handler.dispatchMessage(Handler.java:99)
    E/AndroidRuntime(31393):    at android.os.Looper.loop(Looper.java:132)
    E/AndroidRuntime(31393):    at android.app.ActivityThread.main(ActivityThread.java:4123)
    E/AndroidRuntime(31393):    at java.lang.reflect.Method.invokeNative(Native Method)
     E/AndroidRuntime(31393):   at java.lang.reflect.Method.invoke(Method.java:491)
     E/AndroidRuntime(31393):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
     E/AndroidRuntime(31393):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
     E/AndroidRuntime(31393):   at dalvik.system.NativeStart.main(Native Method)
     E/AndroidRuntime(31393): Caused by: java.lang.IllegalArgumentException: No view found for id 0x7f050001 for fragment Lights1{407bf678 #1 id=0x7f050001}
     E/AndroidRuntime(31393):   at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:770)
    E/AndroidRuntime(31393):    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:977)
    E/AndroidRuntime(31393):    at android.app.BackStackRecord.run(BackStackRecord.java:638)
    E/AndroidRuntime(31393):    at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1309)
    E/AndroidRuntime(31393):    at android.app.Activity.performStart(Activity.java:4406)
    E/AndroidRuntime(31393):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1788)
    E/AndroidRuntime(31393):    ... 11 more

提前感谢任何帮助

1 个答案:

答案 0 :(得分:1)

可能因为“R.id.processing”在视图的XML中不存在。

在你的XML中我看到了

<FrameLayout android:id="@+id/fragment_to_switch_dynamically">

那么可能将R.id.processing更改为R.id.fragment_to_switch_dynamically?