studio medium activity android android-intent preferenceactivity

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.