68

我想从默认的preferences.xml 开始一个活动,带有<intent> 标签。活动经过了很好的测试,问题不在于那个。(我在我的应用程序中扩展了 PreferenceActivity,所以preferences.xml 是“附带”的)请看代码,有什么问题?

首选项.xml:

.... 
<PreferenceCategory 
    android:title="@string/titleEtcSetup">
    <PreferenceScreen
        android:key="renameCourses"
        android:title="@string/titleRenameCourses"
        android:summary="@string/textRenameDisplayedCoursesNames">
        <intent
             android:action="android.intent.action.VIEW"
             android:targetPackage="my.notifier.ui"
             android:targetClass="my.notifier.ui.EditCoursesNamesActivity" />         
    </PreferenceScreen>
.....
</PreferenceCategory>
..... 

清单.xml:

....
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="my.notifier.ui"....
....
<activity android:name=".EditCoursesNamesActivity" android:label="@string/titleRenameCourses">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
 .....

当我按下“renameCourses 项目”时,Activity 没有调用,没有任何反应。LogCat 是“清晰的”,没有错误或警告。我搜索了很多,但没有找到解决方案,也许我只是错过了一些东西......请帮忙!

4

12 回答 12

66

我遇到了同样的问题。我仅通过在我的 AndroidManifest.xml 中声明该操作来实现此功能,如下所示:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.myapp" android:versionName="1.3" android:versionCode="4">

...

    <activity android:name=".activities.MyActivity" 
              android:label="@string/my_activity_title"
              android:theme="@android:style/Theme.Black.NoTitleBar">
        <intent-filter>
           <action android:name="com.example.myapp.activities.MyActivity" />
           <category android:name="android.intent.category.DEFAULT" />
       </intent-filter>
    </activity>

然后在我的 Preferences xml 文件中:

<PreferenceCategory
        android:title="@string/my_activity_title">
    <PreferenceScreen
        android:title="@string/my_activity_title" 
        android:summary="@string/my_activity_title">
        <intent android:action="com.example.myapp.activities.MyActivity"/>
    </PreferenceScreen>
</PreferenceCategory>
于 2012-05-04T01:58:36.070 回答
52

我相信<intent>标签必须在里面<Preference>,而不是<PreferenceScreen>

<PreferenceCategory 
    android:title="@string/titleEtcSetup">
    <Preference
        android:key="renameCourses"
        android:title="@string/titleRenameCourses"
        android:summary="@string/textRenameDisplayedCoursesNames">
        <intent
             android:action="android.intent.action.VIEW"
             android:targetPackage="my.notifier.ui"
             android:targetClass="my.notifier.ui.EditCoursesNamesActivity" />         
    </Preference>
.....
</PreferenceCategory>
于 2011-09-01T20:09:45.183 回答
35

警告!的值targetPackage应该是应用程序的包 ID,如文件的根元素中声明的AndroidManifest.xml(您在 Gradle 构建文件中定义)。它不必和你的 Activity 类的 Java 包一样(人们通常把它们放在 的子包中"ui")。

所以在你的具体情况下,我打赌你targetPackage应该是"my.notifier",而不是"my.notifier.ui"(我必须看到清单才能确定)。

于 2013-05-18T00:07:36.577 回答
22

No need to add IntentFilter. You can refer to activity by fully qualified name:

<intent android:targetPackage="my.notifier.ui"
    android:targetClass="my.notifier.ui.EditCoursesNamesActivity"/>
于 2014-02-13T06:52:26.653 回答
4

当我遇到这个问题时,是因为我为我的活动制作了一个子包。当我将它移到根包中时,首选项屏幕可以启动它。

于 2011-10-06T08:07:07.453 回答
3

此解决方案向您展示了如何将活动连接到您的首选项标题中。

首先,您的目标活动必须像这样在清单中声明:

<activity android:name=".ui.activities.MyActivity">
    <intent-filter>
        <action android:name=".ui.activities.MyActivity" />
        <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>

请注意,活动和操作的 android:name 是相同的。

现在在您的preferences.xml 文件中,您只需要声明一个像这样的标题:

<header
    android:title="@string/my_activity_title"
    android:summary="@string/my_activity_summary">
    <intent android:action=".ui.activities.MyActivity"/>
</header>

这就是它的全部。

于 2013-01-19T19:18:42.330 回答
3

我遇到了同样的问题。并以此解决

androidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.coding1.myapp">
<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">

        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            > 
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
// ==================== HERE ================================
        <activity
            android:name="yaran.AccountWorker.AuthenticatorActivity"
            android:label="@string/app_name"
            >
            <intent-filter>
                <action android:name="AuthenticatorActivity" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
// ========================================================
        <service android:name="yaran.AccountWorker.AuthenticatorService" android:exported="false"  android:process=":auth">
            <intent-filter>
                <action android:name="android.accounts.AccountAuthenticator" />
            </intent-filter>
            <meta-data android:name="android.accounts.AccountAuthenticator"
                       android:resource="@xml/authenticator" />
        </service>
    </application>

并在偏好中:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <PreferenceCategory
        android:title="General Settings" />

    <Preference
        android:key="account_settings"
        android:title="Account Settings"
        android:summary="">
        <intent
            android:action="AuthenticatorActivity"
            android:targetPackage="com.example.coding1.myapp"
            android:targetClass="yaran.AccountWorker.AuthenticatorActivity" />
    </Preference>
</PreferenceScreen>
于 2017-03-18T16:58:45.853 回答
2
<Preference>
    <intent
        android:targetPackage="applicationIdFromBuildGradle"
        android:targetClass="targetClassFromJavaFile.YourClassName"/>
</Preference>
于 2019-08-29T10:18:02.560 回答
1

我可以通过更改意图过滤器中的类别来解决此问题

android.intent.category.DEFAULT

android.intent.category.PREFERENCE

http://developer.android.com/reference/android/content/Intent.html#CATEGORY_PREFERENCE

<activity
  android:name=".ui.DatapackSelectionActivity"
  android:label="@string/app_name"
  android:screenOrientation="portrait"
  android:theme="@android:style/Theme.NoTitleBar" >
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.PREFERENCE" />
    </intent-filter>
</activity>

我想如果您希望您的操作更加具体,只需删除整个类别节点

<activity
  android:name=".ui.DatapackSelectionActivity"
  android:label="@string/app_name"
  android:screenOrientation="portrait"
  android:theme="@android:style/Theme.NoTitleBar" >
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
    </intent-filter>
</activity>
于 2012-05-25T15:02:23.407 回答
1

由于重构包名称,targetPackage 和 targetClass(prefix) 可能会有所不同。检查它的简单方法,您可以删除清单中的活动并调用,startActivity()然后您将在 logCat 中看到此错误:“无法找到显式活动类 {'targetPackage'/'targetClass'}”。这些是您应该写入 Preference>intent 的正确名称。不需要意图过滤器。

于 2015-12-02T10:33:31.357 回答
0

<intent-filter>我通过在清单中声明如下解决了同样的问题:

<activity
    android:name="PeriodosActivity"
    android:label="Periodos"
    android:screenOrientation="portrait">

    <intent-filter>
        <action android:name="Periodos" /> /*Same as in the preference's <intent> element's action attribute*/
        <category android:name="android.intent.category.DEFAULT"/>

</intent-filter>
于 2015-04-25T21:09:28.007 回答
0
<Preference>
<intent
    android:targetPackage="applicationIdFromBuildGradle"
    android:targetClass="targetClassFromJavaFile.YourClassName"/>

请注意在 build.gradle(app)
applicationId "com.some.some"中使用 packgename
我的包在清单和类中就像这个 "com.some.love" 我在运行时遇到异常。这解决了我
参考@style-7

于 2020-01-31T10:58:10.420 回答