Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 不同程序包时的ActivityNotFoundException';首选项屏幕中的目标类_Android_Package_Preference - Fatal编程技术网

Android 不同程序包时的ActivityNotFoundException';首选项屏幕中的目标类

Android 不同程序包时的ActivityNotFoundException';首选项屏幕中的目标类,android,package,preference,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

应用程序的默认包是“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”,但它也不起作用


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

我在尝试使用库项目中的活动来设置AccountManager帐户时遇到了相同的问题。无论我如何尝试调整targetPackage和targetClass属性,它都会抛出一个异常(因为它是一个帐户,所以会使手机崩溃)

我想我们只能假设这是安卓系统的限制。这很笨拙,但您真正需要做的就是在应用程序的命名空间中为活动声明一个包装器类:

public class MyPreferences extends ActualPreferences {
}
在AndroidManifest.xml中声明它

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

如前所述,它不与图书馆合作。按程序进行,类似这样:

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

我不知道是否可以启动一个非默认包。为什么不在targetClass前面用“.”再试一次。像android:targetClass=“.TheActivity”您在哪里看到嵌套的
功能被记录?不应该记录它,因为它是不受支持的内部API。使用该应用程序可能会被拒绝。@Pentium10:它不是未记录的,因为您可以在API演示项目中找到它作为一个例子。@Commonware提到它,您可能希望复制原始意图中的附加内容,如
newIntent.putExtras(oldIntent)
,因此您声明了com.mypackage.MyPreferences.java,但是您编写了targetClass=“com.my.package.settings.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"/>
<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;
                }
            });