2012-03-03 27 views

Respuesta

3

Si desea pasar los datos de la actividad preferencia al uso, la principal actividad de este código:

En su principal clase de actividad (el lanzamiento):

startActivityForResult(new Intent(main.this, preferences.class), 0); 

En su clase de actividad preferencia (establecer el resultado):

Intent i; 
i.putStringExtra("name", "tom"); 
setResult(RESULT_OK, i); 
finish(); 

En su clase de actividad principal (obtener el resultado):

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == 0) { 
     if (resultCode == RESULT_OK){ 
      Log.d("test", data.getExtraString("name"); 
     } 
    } 
} 

Se puede retener la mayor cantidad de extras que quiera y no sólo cadenas, pero todos los tipos de datos estándar.

esperanza que hice todo bien;)

EDITAR

Como Kaarel me dijo, probablemente Missunderstood la cuestión. Esta es la forma en que puede recibir datos desde el activiy principal en la actividad preferencias:

en su actividad principal: poner en marcha la actividad preferencias y adjuntar los datos

String foo = "hello"; 
Intent i = new Intent(); 
i.putExtra("testString", foo);//You can also add other types of variables here, see [1] for reference 
i.setClass(main.this, preferences.class); 
startActivity(i); 

En su actividad preferencias: Recieve los datos adjuntos a la intención

Bundle b = this.getIntent().getExtras();//[2] 
if (b!=null){ 
    String recievedString = b.getString("testString"); 
    //The recievedString variable contains the String "hello" now, see [3] 
} 

[1] https://developer.android.com/reference/android/content/Intent.html

[2] https://developer.android.com/reference/android/content/Intent.html#getExtras%28%29

[3] https://developer.android.com/reference/android/os/Bundle.html

+0

No está respondiendo la pregunta que hizo el OP. La pregunta era: cómo procesar el resultado de un intento que se inició desde una actividad de preferencias, es decir, el 'onActivityResult' debería estar en' PreferencesActivity'. – Kaarel

+0

Mh Creo que tienes razón, editaré la respuesta – MazeChaZer

+0

Creo que todavía estás respondiendo la pregunta incorrecta ... :( – Kaarel

17

La solución más limpia, que yo sepa es escuchar el clic de la preferencia y lanzar la intención explícita. De esta manera, se llamará onActivityResult como de costumbre.

Suponiendo que su intención de preferencia se define en XML se puede adjuntar un oyente a ella del modo siguiente (1234 es un código de solicitud de onActivityResult):

Preference pref = (Preference) findPreference("prefKey"); 
pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { 
    @Override 
    public boolean onPreferenceClick(Preference preference) { 
    startActivityForResult(preference.getIntent(), 1234); 
    return true; 
    } 
}); 
13

Trate anulando startActivity() en su clase PreferencesActivity y crea se llama startActivityForResult() lugar después de comprobar que la intención es la que nos interesa, similar a la siguiente (con 1234 como el código de solicitud):

public class PreferencesActivity { 
    // ... 

    @Override 
    public void startActivity(Intent intent) { 
     if (thisIsTheExpected(intent)) { 
      super.startActivityForResult(intent, 1234); 
     } else { 
      super.startActivity(intent); 
     } 
    } 

    @Override 
    protected void onActivityResult(int reqCode, int resCode, Intent data) { 
     if (reqCode == 1234) { 
      // should be getting called now 
     } 
    } 

    // ... 
} 

Dependiendo de sus necesidades, esto podría ser más simple en comparación con la adición de varios OnPreferenceClickListener en su código :)

+0

Buena idea, aunque Me preocupa que se rompa (en una versión futura de Android), ya que supone que 'startActivity (Intent)' siempre se llama cuando se hace clic en un elemento de preferencia. También 'thisIsTheExpected (intent)' parece menos directo y por lo tanto más propenso a errores que la coincidencia con una clave de preferencia. Por lo tanto, por el momento voy a ir con mi solución. – Kaarel

1

Si se echa un vistazo al código fuente PreferenceActivity.java en la plataforma here en la línea 1000 se puede ver que su intención es llamado a través de startActivity startActivity(header.intent); y no a través de startActivityForResult, así que no creo que esto sea posible.

Sin embargo, podría intentar anular la función onHeaderClick junto con onActivityResult de PreferenceActivity y ver qué ocurre. No lo intenté yo mismo, así que no sé, y hay muchas posibilidades de que este enfoque se rompa en futuras versiones.

Pero tal vez hay otro enfoque que podría funcionar para usted. Como puedo ver en su pregunta de referencia, está iniciando una actividad a través de un intento. Si esta actividad es para la edición de configuraciones, este NO es el enfoque correcto, ya que Android usa esta intención solo para iniciar una actividad y nada más. En mi opinión, es mejor crear su actividad de preferencia específica extendiendo cualquiera de las disponibles para personalizarla. Aquí está mi ListPreference personalizado que yo uso con el fin de permitir al usuario seleccionar una aplicación:

public class CustomSelectAppPreference extends ListPreference { 

//----- Constructor ----- 
public CustomSelectAppPreference(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 
//----- Constructor END ----- 



//----- Public Code ----- 
public void SetResult(String packageName) { 
    if(this.callChangeListener(packageName)) { 
     Editor edit = this.getSharedPreferences().edit(); 
     edit.putString(this.getKey(), packageName); 
     edit.commit(); 
    } 

    this.getDialog().dismiss(); 
} 
//----- Public Code END ----- 



//----- ListPreference Overrides ----- 
@Override 
protected void onPrepareDialogBuilder(Builder builder) { 
    Log.d("CustomSelectAppPreference", "onPrepareDialogBuilder"); 

    super.onPrepareDialogBuilder(builder); 

    String selectedPackage = this.getSharedPreferences().getString(this.getKey(), ""); 

    ListAdapter listAdapter = (ListAdapter) new ApplicationsArrayAdapter(this.getContext(), Utilities.getInstalledApplications(this.getContext(), selectedPackage), this); 

    builder.setAdapter(listAdapter, this); 
} 
//----- ListPreference Overrides END ----- 
} 

Y lo estoy usando en mi preferences.xml así:

<PreferenceScreen android:key="connection_screen" 
     android:title="@string/wpref_Connection_Screen_title" 
     android:summary="@string/wpref_Connection_Screen_summary" 
     android:shouldDisableView="true"> 

    <com.test.app.CustomSelectAppPreference android:key="userSelectedApplication" 
      android:title="@string/wpref_userSelectedApplication_title" 
      android:summary="@string/wpref_userSelectedApplication_summary" 
      android:dialogTitle="@string/userselectedApplication_dialogTitle" 
      android:entries="@array/selectedapps_dummy_actions" 
      android:entryValues="@array/selectedapps_dummy_actionsvalues"   
      android:defaultValue="" 
      android:shouldDisableView="true"/> 
</PreferenceScreen> 

Mediante el uso de este enfoque me puedo controlar todo lo que hace mi usuario en esta actividad sin romper las reglas de android sobre las preferencias.

Espero que esto ayude.

Cuestiones relacionadas