Android:从preferences.xml开始活动

我想从默认的preferences.xml中使用<intent>标签来启动一个Activity。 活动经过了充分的testing,问题不在于此。 (我在我的应用程序中扩展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项目”时Activity没有调用,没有任何反应。 LogCat是“清除”,没有错误或警告。 我search了很多,我没有find解决办法,也许我只是错过了一些东西…请帮助!

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

然后在我的首选项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> 

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

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

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

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

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

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

我能够通过改变意图filter中的类别来解决这个问题

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> 

该解决scheme向您展示了如何将活动连接到您的首选项标题。

首先,您的目标活动必须在清单中声明如下:

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

注意这里的activity和action的android:name是一样的。

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

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

这就是它的一切。

targetPackage和targetClass(前缀)可能会因为重构包名称而有所不同。 简单的方法来检查它,你可以删除清单中的活动,并调用startActivity()然后你会看到这个错误logCat:“无法find明确的活动类{'targetPackage'/'targetClass'}”。 这些是你应该写入首选项>意图的正确名称。 意图filter是不需要的。

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

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> 

我通过在清单中声明<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>