0

I'm new to android development. I'm following this link to create an alert dialog. But I'm receiving NoClassDefFound error at

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

EDIT: Stacktrace

04-19 06:40:08.640: E/AndroidRuntime(1656): FATAL EXCEPTION: main 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): at org.poovelil.gpstest.MainActivity.onCreate(MainActivity.java:37) 04-19 06:40:08.640: E/AndroidRuntime(1656): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1072) 04-19 06:40:08.640: E/AndroidRuntime(1656): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1836) 04-19 06:40:08.640: E/AndroidRuntime(1656): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1893) 04-19 06:40:08.640: E/AndroidRuntime(1656): at android.app.ActivityThread.access$1500(ActivityThread.java:135) 04-19 06:40:08.640: E/AndroidRuntime(1656): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1054) 04-19 06:40:08.640: E/AndroidRuntime(1656): at android.os.Handler.dispatchMessage(Handler.java:99) 04-19 06:40:08.640: E/AndroidRuntime(1656): at android.os.Looper.loop(Looper.java:150) 04-19 06:40:08.640: E/AndroidRuntime(1656): at android.app.ActivityThread.main(ActivityThread.java:4389) 04-19 06:40:08.640: E/AndroidRuntime(1656): at java.lang.reflect.Method.invokeNative(Native Method) 04-19 06:40:08.640: E/AndroidRuntime(1656): at java.lang.reflect.Method.invoke(Method.java:507) 04-19 06:40:08.640: E/AndroidRuntime(1656): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849) 04-19 06:40:08.640: E/AndroidRuntime(1656): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607) 04-19 06:40:08.640: E/AndroidRuntime(1656): at dalvik.system.NativeStart.main(Native Method)

My Code is below.

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();
        }
    }
robert
  • 8,459
  • 9
  • 45
  • 70

3 Answers3

1

The NoClassDefFound error leads me to believe you're using a pre-HC device, which means it doesn't have native support for Fragments. You will need to use the android support library and use FragmentActivity's getSupportFragmentManager() instead.

Check out this page: Using the Support Library

Jschools
  • 2,698
  • 1
  • 17
  • 18
  • Yes, I'm using pre-HC device, but I have added support library. Don't know what is the issue. in android 4.2.2 target it works. – robert Apr 19 '13 at 01:39
1

If you are using minSdk=8 adding support library is not enough. You should use fragment stuff accordingly, and in your case:

  • your custom fragment should inherit from android.support.v4.app.DialogFragment
  • your Activity should inherit from android.support.v4.app.FragmentActivity
  • you should retrieve a support FragmentManager instance via android.support.v4.app.FragmentActivity.getSupportFragmentManager()
a.bertucci
  • 12,142
  • 2
  • 31
  • 32
0

You need add the dialog into FramgmentManager first:

    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");
}
buptcoder
  • 2,692
  • 19
  • 22
  • Actually that's no correct. `DialogFragment` manages all the transition stuff under the hood, it only needs a `FragmentManager` in order to be shown. – a.bertucci Apr 19 '13 at 01:35
  • I see.... It seems I am wrong.. I will try it by myself. Thank you for your correction :) – buptcoder Apr 19 '13 at 01:44
  • You can check yourself here: http://android-developers.blogspot.it/2012/05/using-dialogfragments.html – a.bertucci Apr 19 '13 at 01:46