【问题标题】:Android 2.1 :Caused by: java.lang.ClassNotFoundException: FragmentAndroid 2.1:引起:java.lang.ClassNotFoundException:片段
【发布时间】:2012-05-25 09:13:35
【问题描述】:

我创建了一个应用程序,因为我需要两个片段,所以我声明了一个片段类,并在该类中创建了另一个静态片段类。我将 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);*/
    }
}

【问题讨论】:

    标签: java android android-fragments


    【解决方案1】:

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

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

    【讨论】:

    • 您有权在蜂窝中添加片段类,但以前的 API 中通过 FragmentActivity 类支持
    • @i2v2nr20i ,但是我们在 2.1 中也支持 Fragment 类
    【解决方案2】:

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

    class="frag.demo.TFragment$DFragment"
    

    谢谢你:)

    【讨论】:

    • 现在我已经将第二个片段更改为具有静态函数的单独类,并且第一个片段使用该静态函数...
    • fragment 类可以是静态的吗,如果是的话,哪个类应该持有该 Fragment 类。我在这个链接中看到了那个developer.android.com/reference/android/app/Fragment.html
    • 您是在 Activity 类中声明这个片段类,还是在静态片段类中声明这个片段类?因为,根据文档:“片段与其所在的活动密切相关,不能单独使用。” Fragment 类必须是公共静态类。如果你像我所说的那样声明 Fragment 类,那么使用上面的类属性:class="frag.demo.YourActivity$DFragment"
    • 是的,我将我的 2 个片段类作为静态放入一个名为 DActivity 类的活动中。正如你所说,我更改了 main.xml class="frag.demo.DActivity$TFragment"
    • 不,我收到错误 05-25 15:56:32.764: E/AndroidRuntime(1169): java.lang.RuntimeException: Unable to start activity ComponentInfo{frag.demo/frag.demo.JFragmentActivity} : android.view.InflateException: Binary XML file line #5: Error inflating class fragment 起因:android.view.InflateException: Binary XML file line #5: Error inflating class fragment E/AndroidRuntime(1169): 起因:java。 lang.ClassNotFoundException: android.view.fragment 在加载器dalvik.system.PathClassLoader@44c066f0
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

      • 05-29 10:42:09.405: E/AndroidRuntime(304): java.lang.NoClassDefFoundError: frag.demo.DActivity 我收到了这个错误
      • 和 ofc 将 DActivity 添加到您的清单 ^^ 抱歉延迟回答
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-20
      • 2021-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-02
      • 1970-01-01
      相关资源
      最近更新 更多