ActivityNotFoundException, когда targetClass другого пакета в PreferenceScreen - PullRequest
15 голосов
/ 05 декабря 2010

Пакет приложения по умолчанию - "example.app".

, а пакет целевого действия - "example.app.abc".

Вызов startActivity () для "example.app.abc.TheActivity "в Java-коде просто работает,

, но указание его на preference.xml не работает:

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

Я пробовал android: targetClass =" example.app.abc.TheActivity ", но это тоже не работает.

Невозможно запустить действие пакета, отличного от заданного по умолчанию, в предпочтении?

Ответы [ 2 ]

30 голосов
/ 05 июня 2012

Я только что столкнулся с той же проблемой, когда пытался использовать экран пользовательских настроек из проекта библиотеки для настроек учетной записи AccountManager. Независимо от того, как я пытался настроить атрибуты targetPackage и targetClass, он вызывал бы исключение (за исключением того, что, поскольку это учетная запись, он ломал телефон).

Я думаю, мы просто должны предположить, что это ограничение Android. Это неуклюже, но все, что вам действительно нужно сделать, это объявить класс-оболочку для действия в пространстве имен вашего приложения:

public class MyPreferences extends ActualPreferences {
}

Объявите это в вашем AndroidManifest.xml

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

Тогда вы можете указать класс в вашем намерении

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

Кстати, синтаксис очень суетный , по крайней мере, для настроек аккаунта. Все эти варианты терпят неудачу:

<!-- 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"/>

Критическим фактором является то, что атрибут android:targetPackage соответствует пакету приложения. Если вы хотите, вы можете поместить действие в подпакет. Это работает:

<intent android:targetPackage="com.my.package"
        android:targetClass="com.my.package.settings.MyPreferences" />
1 голос
/ 19 декабря 2013

как уже сказал, он не работает с библиотеками.Сделайте это программно, примерно так:

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