web-dev-qa-db-fra.com

Android: démarrez l'activité à partir de preferences.xml

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!

64
Lama

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>
63
Shygar

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>
48
Michael

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

32
BoD

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"/>
18
dvikv90

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.

4
Kieran

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.

3
Phil

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>
2
Ali Bagheri

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.

1
yoo

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>
1
concept

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>
0
Style-7