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:

  • Crashlytics no encuentra clave API en crashlytics.properties en tiempo de ejecución
  • Crea un menú de estilo "ok glass", dentro de la aplicación glass
  • ¿Dónde aparece android: etiqueta de descripción de su manifiesto?
  • Android NavigationView (material support lib) no interactúa con la barra de estado correctamente
  • Menú en Fragmentos no mostrados
  • Biblioteca avanzada de RecyclerView - ejemplos de código
  • 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?

  • ¿Existen bibliotecas de terceros para Android?
  • Android Spinner Tamaño muy grande
  • No hay sonido de notificación personalizado
  • Android FusedLocationProviderApi: La intención de entrada no tiene LocationResult o LocationAvailability
  • ¿Cómo se entregan los eventos de toque de Android?
  • Clasificación de ListView por nombre del producto con adaptador personalizado?
  • 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.