2013-04-19 4 views
0

Я новичок в разработке Android. Я следую этому link, чтобы создать диалоговое окно предупреждения. Но я получаю ошибку NoClassDefFound вИсключение NoClassDefFound при использовании фрагмента диалога

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)

Мой код находится ниже.

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(); 
     } 
    } 
+0

'minSdk' и' targetSdk' в вашем манифесте? –

+0

minSdk 8, targetSdk 17, я включил android-support-v4.jar в libs. – robert

+0

Можете ли вы опубликовать stacktrace, пожалуйста? –

ответ

1

Если вы используете minSdk=8 добавления библиотеки поддержки не хватает. Вы должны использовать фрагмент материал, соответственно, и в вашем случае:

  • ваш пользовательский фрагмент должен наследовать от android.support.v4.app.DialogFragment
  • вашей активность должна наследоваться от android.support.v4.app.FragmentActivity
  • вы должны получить поддержку FragmentManager экземпляра через android.support.v4.app.FragmentActivity.getSupportFragmentManager()
0

Вам нужно добавить диалог в 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"); 
} 
+0

На самом деле это не правильно. 'DialogFragment' управляет всеми элементами перехода под капотом, для отображения требуется только' FragmentManager'. –

+0

Я вижу ... Кажется, я ошибаюсь. Я попробую это сам. Спасибо за исправление :) – buptcoder

+0

Вы можете проверить себя здесь: http://android-developers.blogspot.it/2012/05/using-dialogfragments.html –

1

Ошибка NoClassDefFound заставляет меня верить, что вы используете предварительно HC устройство, которое означает, что он не имеет встроенной поддержки Фрагменты. Вам нужно будет использовать библиотеку поддержки Android и вместо этого использовать FragmentActivity getSupportFragmentManager().

Заканчивать эту страницу: Using the Support Library

+0

Да, я использую устройство pre-HC, но у меня есть добавлена ​​библиотека поддержки. Не знаю, в чем проблема. в android 4.2.2 целевой он работает. – robert

Смежные вопросы