2010-12-05 10 views
15

El paquete predeterminado de la aplicación es "example.app".ActivityNotFoundException cuando targetClass de paquete diferente en PreferenceScreen

y el paquete de la actividad de destino es "example.app.abc".

Calling startActivity() para "example.app.abc.TheActivity" en código Java simplemente funciona,

pero especificando en preference.xml no funciona:

<PreferenceScreen android:key="key" 
    android:title="@string/title" 
> 
    <intent android:action="android.intent.action.MAIN" 
     android:targetPackage="example.app.abc" 
     android:targetClass="TheActivity" 
/> 
</PreferenceScreen> 

Probé androide : targetClass = "example.app.abc.TheActivity" pero tampoco funciona.

¿Es imposible comenzar una actividad de paquete no predeterminado, con preferencia?

+0

No sé si es posible iniciar un paquete no predeterminado. ¿Por qué no intentarlo de nuevo con un "." frente a la Clase objetivo. como android: targetClass = ". TheActivity" – Varun

+1

¿Dónde se ve la función anidada '' documentada? – CommonsWare

+0

No debe documentarse, ya que es una API interna no compatible. La aplicación puede ser rechazada al usarla. – Pentium10

Respuesta

30

Acabo de encontrarme con el mismo problema cuando trato de usar un custom preference screen desde un proyecto de biblioteca para la configuración de la cuenta de AccountManager. No importa cómo intenté ajustar los atributos targetPackage y targetClass, arrojaría una excepción (excepto que, como es una cuenta, bloquea el teléfono).

Creo que tendremos que asumir que se trata de una limitación de Android. Es torpe, pero lo único que hay que hacer es declarar una clase contenedora para la actividad dentro del espacio de nombres de la aplicación:

public class MyPreferences extends ActualPreferences { 
} 

declararlo en su AndroidManifest.xml

<activity android:name=".MyPreferences"/> 

continuación, puede especificar la clase en su intento

<intent android:targetPackage="com.my.package" 
     android:targetClass="com.my.package.MyPreferences" /> 

por cierto, la sintaxis es muy exigente, al menos para las preferencias de la cuenta. Todas estas variaciones fallan:

<!-- fails --> <intent android:targetClass="com.my.package.MyPreferences" /> 
<!-- fails --> <intent android:targetClass="MyPreferences" 
         android:targetPackage="com.my.package"/> 
<!-- fails --> <intent android:targetClass=".MyPreferences" 
         android:targetPackage="com.my.package"/> 
<!-- fails --> <intent android:targetClass="settings.MyPreferences" 
         android:targetPackage="com.my.package"/> 
<!-- fails --> <intent android:targetClass=".settings.MyPreferences" 
         android:targetPackage="com.my.package"/> 
<!-- fails --> <intent android:targetClass="com.my.other.package.MyPreferences" 
         android:targetPackage="com.my.package"/> 

El factor crítico es aparentemente que el atributo android:targetPackage coincide con el paquete de la aplicación. Si lo desea, puede colocar la actividad en un subpaquete. Esto funciona:

<intent android:targetPackage="com.my.package" 
     android:targetClass="com.my.package.settings.MyPreferences" /> 
+0

+1 para esta excelente explicación –

+0

esto debe marcarse como una respuesta – sidon

+0

Esto es increíble, gracias por la excelente respuesta! –

1

como ya he dicho no funciona con las bibliotecas. Hágalo programáticamente, algo como esto:

preference_my_pref.setOnPreferenceClickListener(new OnPreferenceClickListener() { 
       public boolean onPreferenceClick(Preference preference) { 
        Intent intent = new Intent(MyActivity.this, ActivityToStart.class); 
        startActivity(intent); 
        return true; 
       } 
      }); 
+0

es posible que desee copiar los extras de la intención original como' newIntent.putExtras (oldIntent) ' – NikkyD

Cuestiones relacionadas