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>