2010-12-05 9 views
15

Das Standardpaket der Anwendung ist "example.app".ActivityNotFoundException, wenn targetClass des anderen Pakets in PreferenceScreen

und das Paket der Zielaktivität ist "example.app.abc".

Aufruf startActivity() für "example.app.abc.TheActivity" in Java-Code funktioniert nur,

aber auf preference.xml Angabe nicht funktioniert:

<PreferenceScreen android:key="key" 
    android:title="@string/title" 
> 
    <intent android:action="android.intent.action.MAIN" 
     android:targetPackage="example.app.abc" 
     android:targetClass="TheActivity" 
/> 
</PreferenceScreen> 

Ich habe versucht, android : targetClass = "example.app.abc.TheActivity", aber es funktioniert auch nicht.

Ist es nicht möglich, eine Aktivität eines nicht standardmäßigen Pakets zu starten?

+0

Ich weiß nicht, ob es möglich ist, ein nicht standardmäßiges Paket zu starten. Versuchen Sie es erneut mit einem "." vor der targetClass. wie android: targetClass = ". TheActivity" – Varun

+1

Wo sehen Sie die verschachtelte '' Funktion dokumentiert? – CommonsWare

+0

Es sollte nicht dokumentiert werden, da es eine nicht unterstützte interne API ist. Die Anwendung wird möglicherweise abgelehnt, indem sie verwendet wird. – Pentium10

Antwort

30

Ich habe gerade das gleiche Problem beim Versuch, ein custom preference screen aus einem Bibliotheksprojekt für die AccountManager-Kontoeinstellungen zu verwenden. Egal, wie ich die targetPackage und targetClass-Attribute optimieren wollte, es würde eine Ausnahme auslösen (außer, da es ein Konto ist, stürzt das Telefon ab).

Ich denke, wir müssen nur davon ausgehen, dass dies eine Android-Beschränkung ist. Es ist ungeschickt, aber alles, was Sie wirklich tun müssen, ist eine Wrapper-Klasse für die Aktivität innerhalb Ihrer Anwendung Namespace deklarieren:

public class MyPreferences extends ActualPreferences { 
} 

es erklären in AndroidManifest.xml

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

Dann können Sie die Klasse angeben in Ihrer Absicht

<intent android:targetPackage="com.my.package" 
     android:targetClass="com.my.package.MyPreferences" /> 

By the way, ist die Syntax extrem pingelig, zumindest für Kontoeinstellungen. All diese Variationen fehlschlagen:

<!-- fails --> <intent android:targetClass="com.my.package.MyPreferences" /> 
<!-- fails --> <intent android:targetClass="MyPreferences" 
         android:targetPackage="com.my.package"/> 
<!-- fails --> <intent android:targetClass=".MyPreferences" 
         android:targetPackage="com.my.package"/> 
<!-- fails --> <intent android:targetClass="settings.MyPreferences" 
         android:targetPackage="com.my.package"/> 
<!-- fails --> <intent android:targetClass=".settings.MyPreferences" 
         android:targetPackage="com.my.package"/> 
<!-- fails --> <intent android:targetClass="com.my.other.package.MyPreferences" 
         android:targetPackage="com.my.package"/> 

Der kritische Faktor ist offensichtlich, dass das android:targetPackage Attribut entspricht das Anwendungspaket. Wenn Sie möchten, können Sie die Aktivität in ein Unterpaket einfügen. Das funktioniert:

<intent android:targetPackage="com.my.package" 
     android:targetClass="com.my.package.settings.MyPreferences" /> 
+0

+1 für diese ausgezeichnete Erklärung –

+0

sollte dies als eine Antwort markiert werden – sidon

+0

Dies ist Super, danke für die ausgezeichnete Antwort! –

1

wie schon gesagt es funktioniert nicht mit Bibliotheken. Mach es programmatisch, etwas wie dieses:

preference_my_pref.setOnPreferenceClickListener(new OnPreferenceClickListener() { 
       public boolean onPreferenceClick(Preference preference) { 
        Intent intent = new Intent(MyActivity.this, ActivityToStart.class); 
        startActivity(intent); 
        return true; 
       } 
      }); 
+0

Sie möchten die Extras von der ursprünglichen Absicht wie' newIntent.putExtras (oldIntent) 'kopieren – NikkyD

Verwandte Themen