utilizar studio setresult intent from ejemplo como activity android android-preferences android-activity

studio - return value from activity android



Inicie Activity desde preferences.xml y obtenga el resultado en onActivityResult (4)

Intente anular startActivity() en su clase de PreferencesActivity y startActivityForResult() llamar startActivityForResult() después de verificar que la intención sea la que nos interesa, similar a la siguiente (con 1234 como 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 sencillo en comparación con agregar varios OnPreferenceClickListener en su código :)

Es un complemento a esta pregunta .

Puedo iniciar la Actividad pero también necesito poder obtener el resultado. ¿Cómo lo hago?

Intenté anular onActivityResult en mi PreferencesActivity en vano.

¿Me faltan algunas propiedades adicionales en preferences.xml?


Si desea pasar datos de la actividad de preferencia a su actividad principal, use este código:

En tu clase de actividad principal (lanzamiento):

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

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

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

En tu clase de actividad principal (obtén 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"); } } }

Puede poner tantos extras como desee y no solo cadenas, sino todos los tipos de datos estándar.

Espero haberlo hecho todo bien;)

EDITAR

Como Kaarel me dijo, probablemente entendí mal la pregunta. Así es como puede recibir datos de la actividad principal en la actividad de preferencias:

En su actividad principal: inicie la actividad de preferencias y adjunte 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 de preferencias: reciba 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


Si echa un vistazo a PreferenceActivity.java en el código fuente de la plataforma here en la línea 1000, puede ver que su intención se llama 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, puede intentar anular la función onHeaderClick junto con onActivityResult de PreferenceActivity y ver qué sucede. No lo intenté yo mismo, así que no lo 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á lanzando una actividad a través de un intento. Si esta actividad es para la edición de ajustes, 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 los disponibles para personalizarla. Aquí está mi lista de referencia personalizada que uso para permitir que el usuario seleccione 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 como este:

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

Al utilizar este enfoque, puedo controlar todo lo que mi usuario hace en esta actividad sin romper las reglas de Android sobre las preferencias.

Espero que esto ayude.


La solución más limpia que conozco es escuchar el clic en la preferencia y lanzar la intención explícitamente. De esta manera se onActivityResult como de costumbre.

Suponiendo que su intención-preferencia esté definida en XML, puede adjuntar un oyente de esta manera (donde 1234 es un código de solicitud para onActivityResult ):

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