PreferenceScreen crasht - ActivityNotFoundException

  • Antworten:4
  • Bentwortet
Barrachiel Byzanz
  • Forum-Beiträge: 12

15.02.2011, 12:39:07 via Website

Hallo Leute,
ich habe mich durch das halbe (vielleicht auch 3/4tel) Internet gewuehlt und finde dennoch keine Antwort auf mein Problem. Nach etlichem hin und her, Troubleshooting und einem Anfall von Verzweiflung habe ich mich jetzt hier angemeldet und hoffe, dass mir hier jemand eine Hilfestellung dazu geben kann...

Entwickelt wird das ganze auf Android 1.5

Zu meinem Problem:
Einleitung
Ich arbeite mit einem Studienkollegen an einem Projekt in Form einer AndroidApplication. Er hat sich das ganze Grundgeruest ausgedacht und auch schon alle Klassen erstellt und damit angefangen zu programmieren. Aus irgendeinem Grund hat er allerdings nicht die AndroidConventions eingehalten und das meiste nicht mit Activities gemacht, sondern mit Views - trotzdem gibt es (Gott sei Dank) zumindest eine Activity, naemlich die MainActivity. Diese dient als Controller fuer alles und wird auch bei jeder Klasse im Constructor initiiert.
(Soviel um euch mal einen kleinen (halbwegs verstaendlichen) Einblick in die Architektur zu geben).

Problemstellung:
Wir muessen in diesem Projekt so viele Parameter wie moeglich in einem SettingsMenu zugaenglich und vom User einstellbar machen. Dafuer habe ich mal angefangen eine Klasse UserSettings extends PreferenceActivity zu erstellen. Damit das ganze auch ordentlich laueft habe ich in res auch die dateien res/xml/settings.xml, res/menu/menu.xml, und res/values/arrays.xml erstellt. Ausserdem habe ich die Activity im Manifest.xml hinzugefuegt. Das ganze habe ich dann mal mit einer PreferenceList ausgestattet und wollte das gleich mal von der MainActivity aus starten.
Meine Infrastruktur sieht also so aus:

+ MainActivity extends Activity
1@Override
2 public boolean onCreateOptionsMenu(Menu menu) {
3 super.onCreateOptionsMenu(menu);
4
5 MenuInflater inflater = getMenuInflater();
6 inflater.inflate(at.fhb.g.main.R.menu.upmenu, menu);
7
8 return true;
9 }
10
11 @Override
12 public boolean onOptionsItemSelected(MenuItem item) {
13 super.onOptionsItemSelected(item);
14
15 switch(item.getItemId()) {
16 case R.id.usersettings:
17 loger.debug(TAG, "SHOULD START PREFERENCE-ACTIVITY");
18 startActivity(new Intent(this, UserPreference.class));
19 return true;
20 }
21
22 return false;
23 }

+ UserPreference extends PreferenceActivity
1@Override
2 protected void onCreate(Bundle savedInstanceState) {
3 super.onCreate(savedInstanceState);
4 addPreferencesFromResource(at.fhb.g.main.R.xml.settings);
5// wrote whole packagename to make shure that it's not android.R. which is going to be used
6 }

+ res/xml/settings.xml

+ res/menu/upmenu.xml

1<?xml version="1.0" encoding="utf-8"?>
2<menu
3 xmlns:android="http://schemas.android.com/apk/res/android">
4
5 <item
6 android:id="@+id/usersettings"
7 android:title="@string/usersettings_title"
8 android:alphabeticShortcut="@string/usersettings_shortcut"
9 android:icon="@android:drawable/ic_menu_preferences"></item>
10
11</menu>

+ res/values/arrays.xml

+ AndroidManifest.xml

1<?xml version="1.0" encoding="utf-8"?>
2<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3 package="at.fhb.g.main"
4 android:versionCode="1"
5 android:versionName="1.0">
6 <application android:label="@string/app_name" android:icon="@drawable/gprojectitem" android:debuggable="true">
7 <activity android:name=".MainControler"
8 android:label="@string/app_name"
9 android:screenOrientation="portrait"> <!-- to prevent the application from switching into 'landscape' mode -->
10 <intent-filter>
11 <action android:name="android.intent.action.MAIN" />
12 <category android:name="android.intent.category.LAUNCHER" />
13 </intent-filter>
14 </activity>
15 <activity android:name=".UserPreference"
16 android:label="@string/usersettings_title">
17 </activity>
18</application>
19 <uses-sdk android:minSdkVersion="3" />
20<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
21<!-- added for logging to sdcard -->
22<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
23<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
24</manifest>

Wenn ich jetzt am Emulator (oder am Device selbst (HTC Desire HD)) auf "Menu" druecke, wird mir das MenuItem angezeigt, sobald ich aber darauf druecke, crasht die ganze Anwendung und kommt mit folgendem Fehler im logcat daher:
1D/MAIN_CONTROLER( 2920): SHOULD START PREFERENCE-ACTIVITY
2D/AndroidRuntime( 2920): Shutting down VM
3W/dalvikvm( 2920): threadid=1: thread exiting with uncaught exception (group=0x40025a70)
4I/ActivityManager( 1299): Starting activity: Intent { cmp=at.fhb.g.main/at.fhb.g.userconfig.UserPreference }
5E/AndroidRuntime( 2920): FATAL EXCEPTION: main
6E/AndroidRuntime( 2920): android.content.ActivityNotFoundException: Unable to find explicit activity class {at.fhb.g.main/at.fhb.g.userconfig.UserPreference}; have you declared this activity in your AndroidManifest.xml?

Warum? Ich sehe da den Fehler einfach nicht? Hat hier jemand Erfahrung mit sowas und kann mir vielleicht einen Tipp geben?

Vielen Dank im Vorhinein fuer eure Zeit :)

cheers
Barrachiel

— geändert am 15.02.2011, 12:50:04

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

15.02.2011, 12:46:07 via Website

Da fehtl der package-Name im Zitat der manifest.
Bitte trag den mal hier nach der Vollständigkeit halber, sonst kann man die Fehlermeldung nicht deuten.

Also das

1<manifest package="com.example.project" . . . >

— geändert am 15.02.2011, 12:48:13

Antworten
Barrachiel Byzanz
  • Forum-Beiträge: 12

15.02.2011, 12:51:11 via Website

Hey Rafael,
danke fuer deine schnelle Antwort ;)

Habe den kompletten Code der Manifest.xml oben eingefuegt :)

cheers
Barrachiel

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

15.02.2011, 12:57:48 via Website

Da ist doch schon der Fehler.

Die Klasse liegt scheinbar im package userconfig.
Du übergibst als PackageContext aber "this" also die Main Activity, die im Package main liegt.
Er sucht deine Activity also im falschen package.

Ich kann auch grad nicht nachgucken wie das zu korrigieren wäre.
Ich hoff mal jemand anders kann einspringen, sonst poste ich später nochmal...oder du kriegst es allein hin, jetzt da du das Problem kennst ;)

— geändert am 15.02.2011, 13:00:54

Antworten
Barrachiel Byzanz
  • Forum-Beiträge: 12

15.02.2011, 13:07:02 via Website

Rafael K.
Da ist doch schon der Fehler.

Die Klasse liegt scheinbar im package userconfig.
Du übergibst als PackageContext aber "this" also die Main Activity, die im Package main liegt.
Er sucht deine Activity also im falschen package.

Ich kann auch grad nicht nachgucken wie das zu korrigieren wäre.
Ich hoff mal jemand anders kann einspringen, sonst poste ich später nochmal...oder du kriegst es allein hin, jetzt da du das Problem kennst ;)
super! *kopfauftischklatsch*
danke dafuer, ich hab mir schon gedacht, dass ich den wald vor lauter bauemen nicht mehr seh :)

werd mal sehen, was ich da machen kann :)

EDIT:
Ich hab jetzt einfach die UserPreference.class in das Package at.fhb.g.main verschoben, da sie sonst in ihrem Package ein eher einsames Dasein
haette :) ist vielleicht nicht die sauberste Loesung, aber es haut hin :grin:

Danke nochmal!

— geändert am 15.02.2011, 13:29:23

Antworten