Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Cómo llamar a startactivity para obtener resultados de una clase que no sea de actividad para obtener los resultados

¿Es posible llamar a startActivityForResult() de una clase que no sea de actividad para obtener los resultados?

El escenario es algo como esto:

  • Cómo configurar AlarmManager recurrente para ejecutar código diario
  • ADB no puede detectar mi Kindle Fire en Windows 7, pero el Administrador de dispositivos puede
  • Android: ¿Alinear el botón en la parte inferior derecha de la pantalla usando FrameLayout?
  • Facebook android shareDialog se cierra después de abrir
  • ListView se rellena desde la parte inferior en lugar de desde la parte superior
  • ¿Cómo puedo utilizar un compuesto dibujable en lugar de un LinearLayout que contiene un ImageView y un TextView
  • Tengo una clase NonActivity (no se deriva de la actividad como no es una interfaz de usuario). Esta clase tendrá un montón de funciones (básicamente pasos) para ejecutar. Uno de los pasos requiere mostrar UI (Activity) y luego obtener el resultado (el usuario introduce algo). A continuación, han sido capaces de utilizar los datos en los siguientes pasos siguientes.

    ¿Cómo se puede lograr esto sin derivar de la clase de actividad ya que no tengo componente de IU? También porque no quiero derivar de clase de actividad que significa que no puedo anular OnActivityResult() . ¿De dónde vienen realmente los resultados?

  • Deshabilitar la pantalla de mantenimiento
  • Settings.Secure.HTTP_PROXY obsoleta en ICS, pero no hay información sobre el reemplazo
  • Los complementos de Cordova no funcionan
  • Android - Problemas con el registro de la latencia de inicio
  • ¿Por qué no emuladores estándar de Android?
  • Cuando getView () en ArrayAdapter se llama
  • 3 Solutions collect form web for “Cómo llamar a startactivity para obtener resultados de una clase que no sea de actividad para obtener los resultados”

    startActivityForResult() sólo está disponible en actividades reales en pantalla, ya que es un método en, así, Actividad. Rediseñe su aplicación para que la interfaz de usuario se mueva de las actividades.

    Por otro lado, si su clase no Activada se inicializa y utiliza desde una Actividad en pantalla, podría pasar esa instancia de la Actividad a su clase como parámetro en el constructor y usarla para iniciar otras Actividades.

    Tenga cuidado sin embargo. El uso de este método aumenta el riesgo de una pérdida de memoria, ya que la clase externa (Utils en mi ejemplo) podría mantener una referencia a la actividad incluso después de su desaparición.

    Si todo lo que quieres hacer es acceder a los datos, entonces puedes intentar escribirlo en SharedPreferences o en una base de datos o en algunos archivos y luego usar el contexto de la aplicación (pasado por un constructor de nuevo) para leerlo. Esto reduce el riesgo de una fuga de memoria. Algo como:

     MyApiClass myApiClass = new MyApiClass(getApplicationContext()); 

    EJEMPLO CÓDIGO

    Actividad principal:

     public class Main extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Utils util = new Utils(this); util.startTest(); } @Override protected void onActivityResult(int arg0, int arg1, Intent arg2) { Toast.makeText(this, "onActivityResult called", Toast.LENGTH_LONG).show(); super.onActivityResult(arg0, arg1, arg2); } } 

    Utils clase (que se lanza para el resultado):

     public class Utils { Activity activity; public Utils(Activity ac) { activity = ac; } public void startTest() { Intent i = new Intent(activity, Test.class); activity.startActivityForResult(i, 1); } } 

    Actividad de Prueba:

     public class Test extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Toast.makeText(this, "Test", Toast.LENGTH_LONG).show(); this.setResult(Activity.RESULT_OK); this.finish(); } } 

    StartActivityForResult de una clase que utiliza un fragmento sin GUI visible. Puede encontrar algo como esto en una clase de utilidad.

    Vea runGetUserAccount a continuación. Crea su propio fragmento y ejecuta un startActivityForResult. Entonces tiene su propio onActivityResult.

     public class MyGooglePlay { private static final int CONNECTION_FAILURE_RESOLUTION_REQUEST = 31502; private ActionBarActivity activity; private FragmentManager fragManager; public MyGooglePlay(ActionBarActivity activity) { this.activity = activity; this.fragManager = activity.getSupportFragmentManager(); } /** * Starts an activity in Google Play Services so the user can pick an * account */ private String mEmail = ""; static final int REQUEST_CODE_PICK_ACCOUNT = 1000; public void runGetUserAccount() { if (TextUtils.isEmpty(mEmail)) { // run this code in gui less fragment so we can pickup the // on activity result from inside the mygoogleplay class. Fragment f = new Fragment() { @Override public void onAttach(Activity activity) { super.onAttach(activity); String[] accountTypes = new String[] { "com.google" }; Intent intent = AccountPicker.newChooseAccountIntent(null, null, accountTypes, false, null, null, null, null); startActivityForResult(intent, REQUEST_CODE_PICK_ACCOUNT); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CODE_PICK_ACCOUNT) { if (resultCode == Activity.RESULT_OK) { set_Email(data .getStringExtra(AccountManager.KEY_ACCOUNT_NAME)); // getUsername(); } super.onActivityResult(requestCode, resultCode, data); } //this is to verify the fragment has been removed. //you can log or put a breakpoint to verify @Override public void onDestroy(){ super.onDestroy(); } }; FragmentTransaction fragmentTransaction = this.fragManager .beginTransaction(); fragmentTransaction.add(f, "getusername"); fragmentTransaction.commit(); } } /** * @param mEmail * the mEmail to set */ private void set_Email(String mEmail) { this.mEmail = mEmail; if (!TextUtils.isEmpty(mEmail)) { // TODO notify caller email is ready; // activity.onEmailReady(mEmail); } //we are done with the "getusername" fragment Fragment f = fragManager.findFragmentByTag("getusername"); if (f!=null) { fragManager.beginTransaction().remove(f).commit(); } } } 

    Si desea que el resultado vuelva de la actividad a su clase normal, se supone que es una clase con un adaptador personalizado dentro de ella.

    1. No puede utilizar startActivityForResult porque no está en una actividad
    2. Lo que hice fue que lancé la actividad de la clase con una intención. Entonces calculé o hice lo que tengo que hacer. De esta actividad envío la información a la clase principal supuesta con un método MainActivity.the_method () y en la actividad principal cambié el adaptador personalizado o hice lo que tengo que usar el objeto adaptador y llamar a adapter.getItem (position)

    Espero que esto te pueda dar una idea

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.