Android:从preferences.xml启动Activity


68

我想使用<intent>标签从默认的preferences.xml启动一个Activity。活动已经过良好的测试,问题不在于此。(我在我的应用程序中扩展了PreferenceActivity,因此preferences.xml随之“出现”了)请看一下代码,这是怎么回事?

preferences.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>
..... 

manifest.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项”时,活动没有调用,什么也没发生。LogCat是“清除”的,没有错误或警告。我搜索了很多东西,但没有找到解决方案,也许我只是错过了一些东西……请帮助!


Answers:


65

我有同样的问题。我通过仅在我的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>

11
据我所知,响应动作的任何其他应用程序.activities.MyActivity也将有资格提交启动的Intent。这有点不受欢迎,特别是如果您具有应用程序的Free / Pro版本。
nmr 2014年

50

我相信<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>

感谢您的帖子!但是,一切也仍然以这种方式保持不变。(顺便说一句:我在基础上使用内置的API演示程序来创建代码,并且在PreferenceScreen中包含意图标签)
Lama

我已经在我的Samsung Galaxy S上尝试过此代码,并且效果很好。您尝试过哪个Android版本?
迈克尔

我已经在4-10版之间的所有7种API的AVD上进行了尝试。我不知道可能是什么问题... :(
喇嘛

...我想问你:请尝试使用<PreferenceScreen>标记。也许它也可以在您的设备上使用...
Lama

是的,它确实。我更改了名称,并用字符串替换了字符串引用,但我认为这些更改无法使其起作用。
迈克尔

33

警告!的值targetPackage应为应用程序的包ID,如AndroidManifest.xml文件根元素(在Gradle构建文件中定义)中所声明的那样。不必与Activity类的Java包相同(人们通常将它们放在的子包中"ui")。

因此,在您的特定情况下,我打赌您targetPackage应该是"my.notifier",而不是"my.notifier.ui"(我必须确保看到清单)。


3
当与gradle一起使用不同的buildtype / productFlavors时,请记住这一点!
Morten Holmgaard 2014年

@MortenHolmgaard就是这样!但随后你如何引用包(例如:buildTypes.debug.applicationIdSuffix = ".debug"
TWiStErRob

@TWiStErRob应该引用您的基本软件包-据我所知,如果包含特殊文件,则将获取特定于特定构建类型的文件,具体取决于您的Bbuild Variant。
Morten Holmgaard 2014年

我正在使用产品调味剂。android:targetPackage应该是applicationId而不是包ID。只是认为我们应该对术语有所了解,所以我们不会混淆任何人。
wsgeorge

@BoD,请更新此答案,指出现在重要的软件包在您的gradle中,而不是在清单中。
Brais Gabin 2015年

20

无需添加IntentFilter。您可以使用完全限定的名称来引用活动:

<intent android:targetPackage="my.notifier.ui"
    android:targetClass="my.notifier.ui.EditCoursesNamesActivity"/>

谢谢,你是对的。您不需要任何东西<intent-filter>
弗雷德

4

当我遇到这个问题时,是因为我为自己的活动制作了一个分包。当我将其移至根软件包时,“首选项”屏幕可能会启动它。


我只是遇到了同样的问题,但是找到了不同的解决方案。假设我Activitycom.example.subpackage.Activity...然后该intent元素应该看起来像<intent android:targetPackage="com.example" android:targetClass="com.example.subpackage.Activity"/>
Eric

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>

这就是全部。


2

我有同样的问题。并以此解决

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>

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>

1

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


1
<Preference>
    <intent
        android:targetPackage="applicationIdFromBuildGradle"
        android:targetClass="targetClassFromJavaFile.YourClassName"/>
</Preference>

@Tim Stack我不同意。

您不能不同意,这就是事实。仅包含代码的答案不被认为是一个好的答案,并且会由审核系统接受以进行质量审核
Tim Stack

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>

0
<Preference>
<intent
    android:targetPackage="applicationIdFromBuildGradle"
    android:targetClass="targetClassFromJavaFile.YourClassName"/>

请注意在build.gradle(app)的
applicationId“ com.some.some”中使用packgename。
我的程序包在清单和类中类似于此“ com.some.love”,运行时出现异常。这解决了我的问题
@ style-7

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.