ActivityNotFoundException, когда targetClass другого пакета в PreferenceScreen
Пакет приложения по умолчанию - "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 ответа
Я просто столкнулся с той же проблемой, когда пытался использовать экран пользовательских настроек из проекта библиотеки для настроек учетной записи 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" />
Как уже сказал, его не работает с библиотеками. Сделайте это программно, примерно так:
preference_my_pref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference preference) {
Intent intent = new Intent(MyActivity.this, ActivityToStart.class);
startActivity(intent);
return true;
}
});