medium - Android: Inicie la actividad desde preferences.xml
preferencefragment deprecated (10)
Me gustaría iniciar una actividad desde un preferences.xml predeterminado, con la etiqueta <intent>. Las actividades están bien probadas, el problema no está en eso. (Extiendo PreferenceActivity en mi aplicación, por lo que preferences.xml es "viene" con eso) Por favor, mira el código, ¿qué pasa?
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>
.....
La actividad no llama cuando presiono el "elemento Renombrar cursos", no pasa nada. El LogCat es "claro", sin errores ni advertencias. Estaba buscando mucho, y no encontré una solución, tal vez me perdí algo ... ¡Por favor, ayuda!
¡Precaución! El valor de targetPackage
debe ser el ID del paquete de la aplicación, como se declara en el elemento raíz de su archivo AndroidManifest.xml
(que usted define en su archivo de compilación Gradle). No es necesario lo mismo que el paquete de Java de su clase de Actividad (la gente generalmente los coloca en un subpaquete de "ui"
).
Entonces, en su caso específico, apuesto a que el targetPackage
debería ser "my.notifier"
, no "my.notifier.ui"
(tendría que ver el manifiesto para estar seguro).
Creo que la etiqueta <intent>
debe estar dentro de <Preference>
, no en <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>
Cuando tuve este problema fue porque había hecho un subpaquete para mis actividades. Cuando lo moví al paquete raíz, la pantalla Preferencia podría iniciarlo.
Esta solución muestra cómo conectar una actividad en los encabezados de sus preferencias.
Primero, tu actividad objetivo debe declararse en el manifiesto de esta manera:
<activity android:name=".ui.activities.MyActivity">
<intent-filter>
<action android:name=".ui.activities.MyActivity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
Observe aquí que el android: nombre de la actividad y la acción son los mismos.
Ahora en su archivo preferences.xml solo necesita declarar un encabezado como este:
<header
android:title="@string/my_activity_title"
android:summary="@string/my_activity_summary">
<intent android:action=".ui.activities.MyActivity"/>
</header>
Y eso es todo lo que hay que hacer.
No es necesario agregar IntentFilter. Puede referirse a la actividad por nombre completamente calificado:
<intent android:targetPackage="my.notifier.ui"
android:targetClass="my.notifier.ui.EditCoursesNamesActivity"/>
Pude solucionar esto cambiando la categoría en el filtro de intención de
android.intent.category.DEFAULT
a
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>
Supongo que si quieres que tu acción sea aún más específica, simplemente elimina el nodo de toda la categoría
<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>
Resolví el mismo problema declarando el <intent-filter>
en el manifiesto de la siguiente manera:
<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>
Yo estaba teniendo el mismo problema. Lo hice funcionar solo declarando la acción en mi AndroidManifest.xml, como tal:
<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>
Luego en mi archivo 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>
Yo estaba teniendo el mismo problema. y resolver por esto
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>
y en Preferencia:
<?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 y targetClass (prefijo) pueden diferir debido a la refactorización del nombre del paquete. Una manera fácil de verificarlo puede eliminar actividad en manifiesto y llamar a startActivity()
luego verá este error en logCat: "No se puede encontrar la clase de actividad explícita {''targetPackage'' / ''targetClass''}". Esos son los nombres correctos que debe escribir en Preferencia> intención. Filtro de intención no es necesario.