Search code examples
androidnavigation-drawerpreferences

Unable to start preference screen from NavigationDrawerFragmet


I have created NavigationDrawer activity from File>New>Android Application Project. I choose Navigation Drawer Activity and all goes well till I need to start Preference screen. Application crash. What I have so far:

Main Activity:

...
case R.id.bSettings:
Intent settingsActivity = new Intent(getBaseContext(), Preferences.class);
StartActivity(settingsActivity);
break;
...

Preferences.java:

public class Preferences extends PreferenceFragment {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.preferences);
    }
}

Note that I don't want inline preference, but preference like new activity.

09-22 13:57:57.125: W/EGL_genymotion(2120): eglSurfaceAttrib not implemented 09-22 13:57:57.125: E/OpenGLRenderer(2120): Getting MAX_TEXTURE_SIZE from GradienCache 09-22 13:57:57.137: E/OpenGLRenderer(2120): Getting MAX_TEXTURE_SIZE from Caches::initConstraints() 09-22 13:57:57.137: D/OpenGLRenderer(2120): Enabling debug mode 0 09-22 13:58:00.245: D/AndroidRuntime(2120): Shutting down VM 09-22 13:58:00.249: W/dalvikvm(2120): threadid=1: thread exiting with uncaught exception (group=0xa4ba8648) 09-22 13:58:00.273: E/AndroidRuntime(2120): FATAL EXCEPTION: main 09-22 13:58:00.273: E/AndroidRuntime(2120): android.content.ActivityNotFoundException: Unable to find explicit activity class {ba.arnes.aconverter/ag.android.aconvert.Preferences}; have you declared this activity in your AndroidManifest.xml? 09-22 13:58:00.273: E/AndroidRuntime(2120): at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1628) 09-22 13:58:00.273: E/AndroidRuntime(2120): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1424) 09-22 13:58:00.273: E/AndroidRuntime(2120): at android.app.Activity.startActivityForResult(Activity.java:3390) 09-22 13:58:00.273: E/AndroidRuntime(2120): at android.app.Activity.startActivityForResult(Activity.java:3351) 09-22 13:58:00.273: E/AndroidRuntime(2120): at android.app.Activity.startActivity(Activity.java:3587) 09-22 13:58:00.273: E/AndroidRuntime(2120): at android.app.Activity.startActivity(Activity.java:3555) 09-22 13:58:00.273: E/AndroidRuntime(2120): at ag.android.aconvert.MainActivity.onClick(MainActivity.java:545) 09-22 13:58:00.273: E/AndroidRuntime(2120): at android.view.View.performClick(View.java:4240) 09-22 13:58:00.273: E/AndroidRuntime(2120): at android.view.View$PerformClick.run(View.java:17721) 09-22 13:58:00.273: E/AndroidRuntime(2120): at android.os.Handler.handleCallback(Handler.java:730) 09-22 13:58:00.273: E/AndroidRuntime(2120): at android.os.Handler.dispatchMessage(Handler.java:92) 09-22 13:58:00.273: E/AndroidRuntime(2120): at android.os.Looper.loop(Looper.java:137) 09-22 13:58:00.273: E/AndroidRuntime(2120): at android.app.ActivityThread.main(ActivityThread.java:5103) 09-22 13:58:00.273: E/AndroidRuntime(2120): at java.lang.reflect.Method.invokeNative(Native Method) 09-22 13:58:00.273: E/AndroidRuntime(2120): at java.lang.reflect.Method.invoke(Method.java:525) 09-22 13:58:00.273: E/AndroidRuntime(2120): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 09-22 13:58:00.273: E/AndroidRuntime(2120): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 09-22 13:58:00.273: E/AndroidRuntime(2120): at dalvik.system.NativeStart.main(Native Method) 09-22 13:58:01.841: I/Process(2120): Sending signal. PID: 2120 SIG: 9


Solution

  • You are missing the Activity declaration in AndroidManifest.xml.

    As it says:

    13:58:00.273: E/AndroidRuntime(2120): android.content.ActivityNotFoundException: Unable to find explicit activity class {ba.arnes.aconverter/ag.android.aconvert.Preferences}; have you declared this activity in your AndroidManifest.xml

    Unable to find Preferences

    EDIT:

    Looks like you are trying to launch Activity and your Preferences class is Fragment. So basically you need an Activity class where in layout you have placeholder for fragment (e.g. your Preferences class).

    public class PrefenecesActivity extends FragmentActivity {
        @Override
        protected void onCreate(Bundle s) {
            super.onCreate(s);
            setContentView(R.layout.preferences);
    
            FragmentTransaction transaction = getFragmentManager().beginTransaction();
            transaction.replace(R.id.holder, new PreferencesFrag());
            transaction.commit();
        }
    
        public static class PreferencesFrag extends PreferenceFragment {
            @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                addPreferencesFromResource(R.xml.preferences);
            }
        }
    }
    

    And the layout could look like this:

    <FrameLayout
        android:id="@+id/holder"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    

    Not to forget add the activity to AndroidManifest.xml:

    <activity android:name=".PrefenecesActivity" />
    

    THEN you can use your code:

    case R.id.bSettings:
    Intent settingsActivity = new Intent(getBaseContext(), PrefenecesActivity.class);
    startActivity(settingsActivity);
    break;