Android: actualiza el fragmento "principal" cuando se descarta DialogFragment

Estoy creando una aplicación de Android con un diseño con pestañas usando Tabhost y Fragmentos.

En una de las pestañas (fragmento) tengo una vista de texto que muestra el valor de una variable de cadena. Esta pestaña también tiene un botón que llama a un DialogFragment en el que puedo editar el valor de dicha cadena, a través de un cuadro EditText.

Todo funciona como se esperaba, excepto por una falla: una vez que se descarta DialogFragment y la pestaña vuelve a enfocarse, el texto de la vista de texto no se actualiza automáticamente. Para que se actualice, necesito cambiar de pestaña y volver.

¿Hay alguna instrucción que pueda agregar para que cuando se descarte un DialogFragment, su actividad principal se vuelva a cargar/actualizar?

Gracias de antemano.

EDITAR: Sigo buscando una solución, no pude averiguar cómo usar DialogFragment.istached

preguntado el 09 de marzo de 12 a las 23:03

6 Respuestas

Para establecer una palabra clave, esto se puede hacer a través del mecanismo del controlador.

Tuve una situación similar, mostrando un DialogFragment de un Fragment, donde DialogFragment debería informar su 'descarte al Fragment.

En su caso, parece que usa una Actividad (Fragmento) en lugar de Fragmento, pero creo que eso no hace ninguna diferencia aquí.

Proceso

  1. Cree una clase privada dentro de su Actividad que amplíe a Handler. Anule onHandleMessage() y actualice sus TextViews allí.
  2. Pase una instancia de YourDialogFragmentDismissHandler a YourDialogFragment, por ejemplo, a través de un constructor
  3. Anule onDismiss() en YourDialogFragment y envíe un mensaje, de la manera más simple, uno vacío, a través de la instancia de YourDialogFragmentDismissHandler.

Código

public class YourActivity extends Activity {
    ...
    public void someMethod() {
        ...
        YourDialoagFragment yourDialoagFragment = 
            new YourDialoagFragment(new YourDialogFragmentDismissHandler());
        yourDialoagFragment.show();
        ...
    }

    private class YourDialogFragmentDismissHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            // refresh your textview's here
        }   
    }
    ...
}


public class YourDialoagFragment extends DialoagFragment {
    ...
    Handler handler;

    public YourDialoagFragment(Handler handler) {
        this.handler = handler
    }
    ...
    @Override
    public void onDismiss(DialogInterface dialog) {
        super.onDismiss(dialog);

        handler.sendEmptyMessage(0);
    }
    ...
}

¡Espero que esto ayude!

Respondido el 01 de junio de 12 a las 08:06

Su problema es que la acción de dialogFragment afecta los datos o la vista del fragmento anterior. Y desea actualizar los datos o la vista del fragmento anterior después de descartar el fragmento de diálogo. Pero el rechazo del fragmento de diálogo anterior no puede invocar el fragmento anterior. onCreateView() or onCreate(). En este predicamento, puedes usar Broadcast. Cuando actualiza los datos del fragmento anterior o los datos de la vista. Puede enviar difusión. Una vez que el fragmento anterior recibe la transmisión, el fragmento anterior puede actualizarse ahora, no al descartar el fragmento de diálogo. Creo que esta es una mejor solución, especialmente en multihilo.

Respondido 17 Oct 12, 11:10

Siempre uso comentarios simples con el método onAttach() (pero realmente me gusta la solución stefanjunker). Simplemente deje que su actividad implemente FeedbackListener e implemente sus métodos, luego expanda su DialogFragment de esta manera:

public class SomeDialog extends DialogFragment {
    private FeedbackListener feedbackListener;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            feedbackListener = (FeedbackListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement FeedbackListener");
        }
    }

    public void onButtonPushed(View view) {
        feedbackListener.doSomething();
    }

    public interface FeedbackListener {
        public void doSomething();
    }
}

Respondido el 18 de Septiembre de 13 a las 10:09

Intenté esto pero el control vuelve a la actividad principal, no al fragmento. ¿Cómo enviarlo a fragmento? I - user1324887

puede usar myDialogFragment.isDetached() que devuelve un valor booleano cuando se separa llamado un método donde puede escribir el código para mostrarlo nuevamente.

respondido 10 mar '12, 05:03

¿Cómo sería ese código para volver a mostrar el diseño? Gracias por la ayuda - TYB

no, cuando se descarta el fragmento de diálogo, devolverá falso, entonces puede definir su propio método donde todos los valores de su vista (vista de texto) se pueden establecer nuevamente - Ghouse

La respuesta ideal es así: (Este es un código de muestra de mi aplicación)

Primero defina una interfaz en DialogFragment:

public interface PasswordCreatedCallback{
    void refreshJobsScreen(boolean succesful);
}

Y;

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    try {
        callback = (PasswordCreatedCallback) getTargetFragment();
    } catch (ClassCastException e) {
        throw new ClassCastException("Calling fragment must implement PasswordCreatedListener interface");
    }
}

Y configureTargetFragment del fragmento principal de esta manera:

final PasswordCreateDialogFragment passwordDialog = PasswordCreateDialogFragment.newInstance("");
                    passwordDialog.setTargetFragment(ViewPagerFragment.this, Constants.PASSWORD_CREATED);

Puede llamar a su método de devolución de llamada en cualquier momento que desee y su fragmento principal recibirá una notificación con su método de devolución de llamada.

Respondido 31 ago 15, 09:08

Sé que esto no responde a su pregunta tal como está formulada, pero no veo por qué esto no funcionaría en su caso. Tengo una solución más si esto no funciona.

En su código para DialogFragment.

TextView tv = (TextView) getActivity().findViewById(R.id.Your_id); 

tv.setText("new string");

Respondido 08 Feb 18, 17:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.