【问题标题】:NoClassDefFound exception when using dialog fragment使用 dialogfragment 时出现 NoClassDefFounderror 异常
【发布时间】:2013-04-19 01:15:45
【问题描述】:

我是安卓开发新手。我正在关注这个link 来创建一个警报对话框。 但我在

处收到 NoClassDefFound 错误

newFragment.show(getFragmentManager(), "dialog");

编辑:堆栈跟踪

04-19 06:40:08.640:E/AndroidRuntime(1656):致命异常:主要 04-19 06:40:08.640: E/AndroidRuntime(1656): java.lang.NoClassDefFoundError: org.poovelil.gpstest.MainActivity$MyAlertDialogFragment 04-19 06:40:08.640:E/AndroidRuntime(1656):在 org.poovelil.gpstest.MainActivity.onCreate(MainActivity.java:37) 04-19 06:40:08.640:E/AndroidRuntime(1656):在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1072) 04-19 06:40:08.640: E/AndroidRuntime(1656): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1836) 04-19 06:40:08.640: E/AndroidRuntime(1656): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1893) 04-19 06:40:08.640: E/AndroidRuntime(1656): 在 android.app.ActivityThread.access$1500(ActivityThread.java:135) 04-19 06:40:08.640:E/AndroidRuntime(1656):在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1054) 04-19 06:40:08.640: E/AndroidRuntime(1656): 在 android.os.Handler.dispatchMessage(Handler.java:99) 04-19 06:40:08.640:E/AndroidRuntime(1656):在 android.os.Looper.loop(Looper.java:150) 04-19 06:40:08.640: E/Android 运行时(1656):在 android.app.ActivityThread.main(ActivityThread.java:4389) 04-19 06:40:08.640:E/AndroidRuntime(1656):在 java.lang.reflect.Method.invokeNative(Native Method) 04-19 06:40:08.640:E/AndroidRuntime(1656):在 java.lang.reflect.Method.invoke(Method.java:507) 04-19 06:40:08.640: E/Android 运行时(1656):在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849) 04-19 06:40:08.640: E/AndroidRuntime(1656): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607) 04-19 06:40:08.640:E/AndroidRuntime(1656):在 dalvik.system.NativeStart.main(Native Method)

我的代码如下。

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
        boolean gpsOn = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
        boolean networkOn = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 
        if(!gpsOn) {
            Toast.makeText(getApplicationContext(), "GPS Provider is off", Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(getApplicationContext(), "GPS Provider is on", Toast.LENGTH_SHORT).show();
        } 

        if(!networkOn) {
            Toast.makeText(getApplicationContext(), "Network provider is off", Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(getApplicationContext(), "Network provider is on", Toast.LENGTH_LONG).show();
        }

        if(!networkOn || !gpsOn) {
            DialogFragment newFragment = MyAlertDialogFragment.newInstance(1);
            newFragment.show(getFragmentManager(), "dialog");
             //startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    public static class MyAlertDialogFragment extends DialogFragment {

        public static MyAlertDialogFragment newInstance(int title) {
            MyAlertDialogFragment frag = new MyAlertDialogFragment();
            Bundle args = new Bundle();
            args.putInt("title", title);
            frag.setArguments(args);
            return frag;
        }

        public Dialog onCreateDialog(Bundle savedInstanceState) {
            int title = getArguments().getInt("title");


            return new AlertDialog.Builder(getActivity())
                //.setIcon(R.drawable.alert_dialog_icon)
                .setTitle(title)
                .setPositiveButton("Ok", new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface arg0, int arg1) {
                        //((FragmentAlertDialog) getActivity()).doPositiveClick();

                    }
                })
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface arg0, int arg1) {


                    }
                })
                .create();
        }
    }

【问题讨论】:

  • minSdktargetSdk 在您的清单中吗?
  • minSdk 8,targetSdk 17,我在 libs 中包含了 android-support-v4.jar。
  • 你能发布堆栈跟踪吗?
  • @mr_archano 堆栈跟踪已添加

标签: android eclipse-adt


【解决方案1】:

如果您使用minSdk=8,添加支持库是不够的。你应该相应地使用片段的东西,在你的情况下:

  • 你的自定义片段应该继承自android.support.v4.app.DialogFragment
  • 你的活动应该继承自android.support.v4.app.FragmentActivity
  • 您应该通过android.support.v4.app.FragmentActivity.getSupportFragmentManager() 检索支持FragmentManager 实例

【讨论】:

    【解决方案2】:

    NoClassDefFound 错误让我相信您使用的是 pre-HC 设备,这意味着它不具备对 Fragments 的原生支持。您将需要使用 android 支持库并改用 FragmentActivity 的getSupportFragmentManager()

    查看此页面:Using the Support Library

    【讨论】:

    • 是的,我使用的是 pre-HC 设备,但我添加了支持库。不知道是什么问题。在 android 4.2.2 目标中它可以工作。
    【解决方案3】:

    您需要先将对话框添加到 FramgmentManager:

        FragmentManager fm = getFragmentManager();
        DialogFragment newFragment = null;
    
        final FragmentTransaction transaction = fm.beginTransaction();
        newFragment = (DialogFragment)fm.findFragmentByTag("dialog");
        if (newFragment == null) {
            newFragment = MyAlertDialogFragment.newInstance(1)
            transaction.add(0x11313123, newFragment, "dialog");
        }
       newFragment.show(getFragmentManager(), "dialog");
    }
    

    【讨论】:

    • 其实这是不对的。 DialogFragment 管理后台的所有过渡内容,它只需要 FragmentManager 即可显示。
    • 我明白了....看来我错了..我会自己尝试一下。谢谢你的纠正:)
    • 您可以在这里查看自己:android-developers.blogspot.it/2012/05/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 2021-05-11
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多