0

我创建了一个需要两个片段的应用程序,因此我声明了一个片段类,并在该类中创建了另一个静态片段类。我将 main.xml 更改为

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
             android:layout_width="fill_parent"
             android:layout_height="fill_parent">
    <fragment
        android:id="@+id/titles"
        android:layout_width="25dp"
        android:layout_height="wrap_content"
        class="frag.demo.DActivity$TFragment" />

    <fragment
        android:id="@+id/details"
        android:layout_width="25dp"
        android:layout_height="wrap_content"
        class="frag.demo.DActivity$DFragment" />

</FrameLayout>

在运行这个应用程序时,我得到了运行时异常,比如

05-25 14:39:45.224: E/AndroidRuntime(911): Uncaught handler: thread main exiting due to uncaught exception
05-25 14:39:45.264: E/AndroidRuntime(911): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{frag.demo/frag.demo.JFragmentActivity}: java.lang.ClassNotFoundException: frag.demo.JFragmentActivity in loader dalvik.system.PathClassLoader@44e8c6f0
05-25 14:39:45.264: E/AndroidRuntime(911):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2417)
05-25 14:39:45.264: E/AndroidRuntime(911):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
05-25 14:39:45.264: E/AndroidRuntime(911):  at android.app.ActivityThread.access$2200(ActivityThread.java:119)
05-25 14:39:45.264: E/AndroidRuntime(911):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
05-25 14:39:45.264: E/AndroidRuntime(911):  at android.os.Handler.dispatchMessage(Handler.java:99)
05-25 14:39:45.264: E/AndroidRuntime(911):  at android.os.Looper.loop(Looper.java:123)
05-25 14:39:45.264: E/AndroidRuntime(911):  at android.app.ActivityThread.main(ActivityThread.java:4363)
05-25 14:39:45.264: E/AndroidRuntime(911):  at java.lang.reflect.Method.invokeNative(Native Method)
05-25 14:39:45.264: E/AndroidRuntime(911):  at java.lang.reflect.Method.invoke(Method.java:521)
05-25 14:39:45.264: E/AndroidRuntime(911):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
05-25 14:39:45.264: E/AndroidRuntime(911):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
05-25 14:39:45.264: E/AndroidRuntime(911):  at dalvik.system.NativeStart.main(Native Method)
05-25 14:39:45.264: E/AndroidRuntime(911): Caused by: java.lang.ClassNotFoundException: frag.demo.JFragmentActivity in loader dalvik.system.PathClassLoader@44e8c6f0
05-25 14:39:45.264: E/AndroidRuntime(911):  at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
05-25 14:39:45.264: E/AndroidRuntime(911):  at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
05-25 14:39:45.264: E/AndroidRuntime(911):  at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
05-25 14:39:45.264: E/AndroidRuntime(911):  at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
05-25 14:39:45.264: E/AndroidRuntime(911):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2409)

05-25 14:39:45.264: E/AndroidRuntime(911): ... 11 更多

我的 JFragmentActivity 类扩展了 FragmentActivity。所以请告诉我代码出错的地方......

我的活动课

public class DActivity extends FragmentActivity {// from android.support.v4.app.*;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       Log.i("DA","active");
        if (getResources().getConfiguration().orientation
                == Configuration.ORIENTATION_LANDSCAPE) {
            // If the screen is now in landscape mode, we can show the
            // dialog in-line with the list so we don't need this activity.
            finish();
            return;
        }

        if (savedInstanceState == null) {
            // During initial setup, plug in the details fragment.
            DFragment details = new DFragment();
            details.setArguments(getIntent().getExtras());
            getSupportFragmentManager().beginTransaction().add(android.R.id.content, details).commit();
        }
    }
    public static class TFragment extends ListFragment {
        boolean mDualPane;
        int mCurCheckPosition = 0;
        String nos[]={"1","2","3","4","5"};
        public TFragment(){

        }
        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onActivityCreated(savedInstanceState);
            Log.i("TF","active");
            setListAdapter(new ArrayAdapter<String>(getActivity(),R.layout.simple_list,nos));
            View detailsFrame = getActivity().findViewById(R.id.nos);
            mDualPane = detailsFrame != null && detailsFrame.getVisibility() == View.VISIBLE;
            if (savedInstanceState != null) {
                // Restore last state for checked position.
                mCurCheckPosition = savedInstanceState.getInt("curChoice", 0);
            }
             if (mDualPane) {
                    // In dual-pane mode, the list view highlights the selected item.
                    getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
                    // Make sure our UI is in the correct state.
                    showDetails(mCurCheckPosition);
                }
        }
         @Override
            public void onSaveInstanceState(Bundle outState) {
                super.onSaveInstanceState(outState);
                outState.putInt("curChoice", mCurCheckPosition);
            }
         @Override
            public void onListItemClick(ListView l, View v, int position, long id) {
                showDetails(position);
            }
         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);

                    // Check what fragment is currently shown, replace if needed.
                    DFragment details = (DFragment)
                            getFragmentManager().findFragmentById(R.id.nos);
                    if (details == null || details.getShownIndex() != index) {
                        // Make new fragment to show this selection.
                        details = DFragment.newInstance(index);

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

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


    }
    public static class DFragment extends Fragment {
        String names[]={"aaa","bbb","ccc","ddd","eee"};
        public DFragment() {
            // TODO Auto-generated constructor stub
        }
    public static DFragment newInstance(int index){
        DFragment f= new DFragment();
        Bundle args=new Bundle();
        args.putInt("index", index);
        f.setArguments(args);
        return f;
    }
    public int getShownIndex() {
        return getArguments().getInt("index", 0);
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        Log.i("DF","active");
        if (container == null) {
            return null;
        }
         ScrollView scroller = new ScrollView(getActivity());
         TextView text = new TextView(getActivity());
         int padding = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
                 4, getActivity().getResources().getDisplayMetrics());
         text.setPadding(padding, padding, padding, padding);
         scroller.addView(text);
         text.setText(names[getShownIndex()]);
         return scroller;
    }

    }
}

我的主要活动课程是

public class JFragmentActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i("main","active");
        setContentView(R.layout.main);
        /*Intent i = new Intent(getApplicationContext(), DActivity.class);
        startActivity(i);*/
    }
}
4

4 回答 4

2

您的标题暗示您正在尝试在 2.1 上运行此代码,如果是这种情况,那就是您的问题。

Fragment 类是在 API 级别 11(即 Android 3.0)中添加的,因此除非您有 Honeycomb 平板电脑或 ICS 手机或平板电脑,否则您将无法运行它。

于 2012-06-06T15:04:13.773 回答
0

如果第二个片段在第一个片段内,那么第二个片段的类属性应该是:

class="frag.demo.TFragment$DFragment"

谢谢 :)

于 2012-05-25T09:27:32.397 回答
0

您应该将活动添加到清单文件中。查看它以获取示例代码。

于 2012-05-25T12:43:05.297 回答
0

如果您上面的代码仍然正确,那么您的主要活动 JFragmentActivity 会尝试通过 xml 加载 DActivity 的片段,但这是不可能的,因为这些片段与 DActivity 相关联。所以 DActivity 是唯一能够调用它们的活动。

所以你/* Intent */是对的。将你FrameLayoutmain.xml文件应用到一个新的DActivityxml 文件并加载它onCreate,然后在你的JFragmentActivity. LinearLayout在您的应用程序中随机放置一些JFragmentActivity并运行该应用程序。

片段的类属性应该是这样的class="frag.demo.DActivity$DFragment"

于 2012-05-28T13:20:22.287 回答