Je voudrais démarrer une activité à partir d'un fichier preferences.xml par défaut, avec la balise <intent>. Les activités sont bien testées, le problème n'est pas avec ça. (J'étends PreferenceActivity dans mon application, donc le fichier preferences.xml est "livré" avec ça) Veuillez regarder le code, qu'est-ce qui ne va pas?
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>
.....
L'activité n'appelle pas lorsque j'appuie sur "l'élément renameCourses", rien ne se passe. Le LogCat est "clair", sans erreurs ni avertissements. Je cherchais beaucoup et je n'ai pas trouvé de solution, peut-être que j'ai raté quelque chose ... Aidez-moi!
J'avais le même problème. J'ai obtenu cela en déclarant uniquement l'action dans mon AndroidManifest.xml, en tant que tel:
<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>
Puis dans mon fichier xml Préférences:
<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>
Je crois <intent>
la balise doit être à l'intérieur <Preference>
, ne pas <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>
Mise en garde! La valeur de targetPackage
doit être l'ID de package de l'application, comme déclaré dans l'élément racine de votre AndroidManifest.xml
fichier (que vous définissez dans votre fichier de construction Gradle). Il n'est pas nécessaire de la même manière que le Java de votre classe Activity (les gens les mettent généralement dans un sous-paquetage de "ui"
).
Donc, dans votre cas particulier, je parie que le targetPackage
devrait être "my.notifier"
, ne pas "my.notifier.ui"
(Il faudrait que je voie le manifeste pour être sûr).
Pas besoin d'ajouter IntentFilter. Vous pouvez vous référer à l'activité par un nom complet:
<intent Android:targetPackage="my.notifier.ui"
Android:targetClass="my.notifier.ui.EditCoursesNamesActivity"/>
Quand j'ai eu ce problème c'est parce que j'avais fait un sous-package pour mes activités. Lorsque je l'ai déplacé dans le package racine, l'écran Préférences a pu le lancer.
Cette solution vous montre comment câbler une activité dans vos en-têtes de préférences.
Tout d'abord, votre activité cible doit être déclarée dans le manifeste comme ceci:
<activity Android:name=".ui.activities.MyActivity">
<intent-filter>
<action Android:name=".ui.activities.MyActivity" />
<category Android:name="Android.intent.category.DEFAULT" />
</intent-filter>
</activity>
Notez ici que Android: le nom de l'activité et de l'action sont les mêmes.
Maintenant, dans votre fichier preferences.xml, il vous suffit de déclarer un en-tête comme celui-ci:
<header
Android:title="@string/my_activity_title"
Android:summary="@string/my_activity_summary">
<intent Android:action=".ui.activities.MyActivity"/>
</header>
Et c'est tout ce qu'il y a à faire.
J'avais le même problème. et résoudre par ce
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>
et de préférence:
<?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>
targetPackage et targetClass (préfixe) peuvent différer en raison du refactoring du nom du package. Un moyen facile de le vérifier, vous pouvez supprimer l'activité dans le manifeste et appeler startActivity()
, puis vous verrez cette erreur dans logCat: "Impossible de trouver la classe d'activité explicite {'targetPackage'/'targetClass'}". Ce sont les bons noms que vous devez écrire dans Préférence> intention. Le filtre d'intention n'est pas nécessaire.
J'ai pu résoudre ce problème en changeant la catégorie dans le filtre d'intention de
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>
Je suppose que si vous voulez que votre action soit encore plus spécifique, supprimez tout le nœud de catégorie
<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>
J'ai résolu le même problème en déclarant le <intent-filter>
dans le manifeste comme suit:
<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>
<Preference>
<intent
Android:targetPackage="applicationIdFromBuildGradle"
Android:targetClass="targetClassFromJavaFile.YourClassName"/>
</Preference>