2010-12-05 23 views
15

该应用程序的默认包为“example.app”。PreferenceScreen中的不同包的目标类别为ActivityNotFoundException

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

在Java代码只是工作调用startActivity()的 “example.app.abc.TheActivity”,

,但其指定的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”,但它不起作用。

是否不可能启动非默认包的活动?

+0

我不知道它是否有可能启动一个非默认包。你不用你再试一次“。”在targetClass前面。像android:targetClass =“.Activity” – Varun 2010-12-05 18:00:31

+1

你在哪里看到嵌套的``特征记录? – CommonsWare 2010-12-05 18:32:21

+0

它不应被记录,因为它是不受支持的内部API。该应用程序可能会被拒绝使用它。 – Pentium10 2010-12-05 20:03:11

回答

30

我试图使用AccountManager帐户设置的库项目中的custom preference screen时遇到了同样的问题。无论我如何调整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

正如已经说过,它不与库工作。做它编程方式,像这样:

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