ActivityNotFoundException, когда разные целевые объекты пакета в 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", но он тоже не работает.

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

Ответы

Ответ 1

Я столкнулся с той же проблемой при попытке использовать экран пользовательских настроек из проекта библиотеки для настроек учетной записи 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" />

Ответ 2

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

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