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


IU de Android: ¿cuándo puedo modificar directamente una vista?

Tengo una aplicación con dos actividades. Desde la actividad principal comienzo una actividad secundaria usando startActivityForResult() . La actividad secundaria devuelve datos (en la forma de un objeto Intent ) a la actividad principal. En la actividad principal tengo un método onActivityResult() para manejar el regreso de la actividad secundaria.

Dentro de este método onActivityResult() , necesito actualizar una View en la actividad principal (para reflejar los nuevos valores de datos). No explico explícitamente ningún hilo. Mi pregunta es: ¿puedo modificar directamente la vista desde dentro del método onActivityResult() , o tengo que poner un evento en la cola de la interfaz de usuario para hacerlo? Para ser más explícito: ¿puedo estar seguro de que el método onActivityResult() está en el subproceso de la interfaz de usuario y, en ese caso, puedo olvidarme de la cola de la interfaz de usuario?

  • ¿Es una buena práctica crear AsyncTask anónima para paralelo pequeño proceso de congelación conocido?
  • Servicio de Android e hilo de la interfaz de usuario
  • Android, creando un hilo sencillo que actualizará mi contador de segundos
  • Android - llamando al hilo de ui del hilo de trabajo
  • No se puede crear el controlador dentro de hilo que no ha llamado Looper.prepare ()
  • Cómo actualizar la interfaz de usuario desde el servicio de Android utilizando RxJava / RxAndroid
  • Diferencia entre Handler.post (Runnable r) y Activity.runOnUiThread (Runnable r)
  • ¿Es posible usar AsyncTask en una clase de servicio?
  • 5 Solutions collect form web for “IU de Android: ¿cuándo puedo modificar directamente una vista?”

    1. Sí, puede modificar la vista en onActivityResult() . Puede modificar las vistas de una Activity cualquier momento después de llamar a setContentView() en onCreate() , siempre y cuando se ejecute en el subproceso de la interfaz de usuario.

    2. Sí, onActivityResult() se llama en el subproceso de la interfaz de usuario. Esto es válido para todos los métodos del ciclo de vida ( onCreate() , onResume() , etc.).

    Aunque onActivityResult está en un subproceso Ui, es posible que no vea su interfaz de usuario actualizada cuando se modifica en onActivityResult . Sospecho que la razón está redibujando de elementos de Ui en onResume que fuerza a los elementos del ui para reajustar llamando resetViews() de ActivityTransitionState en super.onResume() .

    Me enfrenté con este problema mientras que simplemente actualizando un EditText dentro onActivityResult . EditText no se actualizó.

    La solución consiste en guardar sus datos en onActivityResult y actualizar Ui en onResume estableciendo un indicador en onActivityResult .

    El onActivityResult () se ejecuta en el subproceso de interfaz de usuario, puede modificar la vista en este método.

    Cuando intento crear y mostrar un AlertDialog en onActivityResult () volviendo de hacer una foto, consigo un error de "android.view.WindowLeaked" android.view.WindowLeaked:

    Actividad com … MainActivity ha filtrado ventana com.android.internal.policy.impl.PhoneWindow $ DecorView {37ac7e30 VE …. R ….. I. 0,0-1272,584} que fue agregado originalmente aquí

    Tan pronto como intento mostrar el diálogo.

    Así que creo que no siempre es correcto suponer que OnActivityResult () se ejecuta en el hilo principal.

    En Fragmento Actual AddNewAccountFragment

      public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { if (requestCode == Constants.CHOOSE_BANK_REQUEST_CODE) { bankName = data.getStringExtra("BANK_NAME"); if (!TextUtils.isEmpty(bankName)) { mChooseBankEdittext.setText(bankName); mReceivedBankName = bankName; } } } } 

    // if sending data from next fragment to previous fragment using OnActivityResult.

    SetText en Editado en OnResume .

      @Override public void onResume() { super.onResume(); mChooseBankEdittext.setText(bankName); } 

    En el fragmento de destino ChooseBankNameFragment

    Se realiza a continuación onClick () en Fragment

     Intent intent = new Intent(getActivity(), AddNewAccountFragment.class); intent.putExtra("BANK_NAME", bankName); if (getFragmentManager().findFragmentByTag("AddNewAccountFragment") != null) getFragmentManager().findFragmentByTag("AddNewAccountFragment").onActivityResult(Constants.CHOOSE_BANK_REQUEST_CODE, RESULT_OK, intent); getActivity().getSupportFragmentManager().popBackStack(); 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.