当PreferenceScreen中的不同包的targetClass时,ActivityNotFoundException

时间:2010-12-05 17:22:30

标签: android package preference

应用程序的默认包是“example.app”。

目标活动的包是“example.app.abc”。

在java代码中调用“example.app.abc.TheActivity”的startActivity()就可以了,

但在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 个答案:

答案 0 :(得分:30)

我尝试使用库项目中的custom preference screen进行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 :(得分:1)

已经说过它不与图书馆合作。以编程方式进行,类似这样:

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