Así que tengo un DialogFragment del Área de visualización de lista de selección. Una vez que el usuario hace clic en el área, la lista de intentar volver a capturar los datos de visualización de la Calle de lista de selección. En este punto, me gustaría permitir que el usuario pulse hardware botón atrás para volver a la selección del Área. Es esto posible? He tratado de omitir algunos de los métodos a continuación, pero sólo puedo tocar para el evento, pero no para impedir que se produzca.

@Override
public void onCancel(DialogInterface dialog) {
    if(isDismissable()){
        super.onCancel(dialog);
    }else {
        Log.d(TAG, "Don't dismiss cancel this dialog!");
    }
}

@Override
public void dismissAllowingStateLoss() {
    if(isDismissable()){
        super.dismissAllowingStateLoss();
    }else {
        Log.d(TAG, "Don't dismiss this dialog!");
    }
}

@Override
public void dismiss() {
    if(isDismissable()){
        super.dismiss();
    }else {
        Log.d(TAG, "Don't dismiss this dialog!");
    }
}

dismiss() se llama cuando el usuario pulse de nuevo el botón, pero incluso si yo no lo llamo super.dismiss(), diálogo descartada independientemente.

Hay una manera de hacer esto? Yo también mire cómo Google+ aplicación está mostrando ActionBar en el DialogFragment para proporcionar HomeAsUp pero no puedo encontrar ninguna información sobre ella.

OriginalEl autor RobGThai | 2013-12-17

3 Comentarios

  1. 5

    Veo dos soluciones:

    La más sencilla: Han de selección de la Zona y de la Calle de lista de selección tanto por separado como de costumbre fragmentos y tienen tanto de ellos en una actividad independiente y tienen esta actividad como un diálogo a través de un simple tema:
    <activity android:theme="@android:style/Theme.Dialog" /> y han excludeFromRecents="true" para no tener este en las recientes aplicaciones usadas.
    La selección del área se carga por primera vez, a continuación, añadir la calle de la selección a través de addToBackStack(null) así que tendrás AreaSelection fragmento debajo.

    Si usted no quiere tener una actividad separada de esta por cualquier razón, usted podría agregar un cuadro de diálogo de escucha de su dialogfragment y su implementador (de la actividad), se abrirá la AreaFragment. Con una comprensión básica de su código de este proyecto debe hacerlo:

    El titular de la actividad:

    import com.example.adip.fragments.AreaSelectionFragment;
    import com.example.adip.fragments.StreetSelectionFragment;
    import com.example.adip.fragments.AreaSelectionFragment.AreaSelectionListener;
    import com.example.adip.fragments.StreetSelectionFragment.StreetSelectionListener;
    import android.os.Bundle;
    import android.support.v4.app.DialogFragment;
    import android.support.v4.app.FragmentActivity;
    import android.view.View;
    import android.view.View.OnClickListener;
    public class DialogsActivity extends FragmentActivity implements OnClickListener,
    AreaSelectionListener, StreetSelectionListener {
    private static final String AREA_TAG = "AREA_TAG";
    private static final String STREETS_TAG = "STREETS_TAG";
    @Override
    protected void onCreate(Bundle savedInstance) {
    super.onCreate(savedInstance);
    setContentView(R.layout.area_selections);
    findViewById(R.id.btnStuff).setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
    showArea();
    }
    private void showArea() {
    DialogFragment df = new AreaSelectionFragment();
    df.show(getSupportFragmentManager(), AREA_TAG);
    }
    @Override
    public void onStreetsUserCanceled() {
    showArea();
    }
    @Override
    public void showStreets() {
    DialogFragment df = new StreetSelectionFragment();
    df.show(getSupportFragmentManager(), STREETS_TAG);
    }
    }

    AreaSelectionFragment (extiendo a vuestras necesidades):

    import android.app.Activity;
    import android.app.AlertDialog;
    import android.app.Dialog;
    import android.content.DialogInterface;
    import android.content.DialogInterface.OnClickListener;
    import android.os.Bundle;
    import android.support.v4.app.DialogFragment;
    public class AreaSelectionFragment extends DialogFragment {
    public static interface AreaSelectionListener {
    void showStreets();
    }
    private AreaSelectionListener areaSelectionListener;
    @Override
    public void onAttach(Activity activity) {
    super.onAttach(activity);
    if (activity instanceof AreaSelectionListener) {
    areaSelectionListener = (AreaSelectionListener) activity;
    } else {
    throw new ClassCastException("Parent Activity must implement AreaSelectionListener");
    }
    }
    @Override
    public void onDetach() {
    super.onDetach();
    areaSelectionListener = null;
    }
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
    return new AlertDialog.Builder(getActivity()).setTitle("Area Selection")
    .setPositiveButton("OK", new OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
    areaSelectionListener.showStreets();
    }
    }).setNegativeButton("Cancel", null).create();
    }
    }

    Y StreetSelectionFragment (de nuevo: extiendo a vuestras necesidades):

    import android.app.Activity;
    import android.app.AlertDialog;
    import android.app.Dialog;
    import android.content.DialogInterface;
    import android.content.DialogInterface.OnClickListener;
    import android.os.Bundle;
    import android.support.v4.app.DialogFragment;
    public class StreetSelectionFragment extends DialogFragment {
    public static interface StreetSelectionListener {
    void onStreetsUserCanceled();
    }
    private StreetSelectionListener selectionListener;
    @Override
    public void onAttach(Activity activity) {
    super.onAttach(activity);
    if (activity instanceof StreetSelectionListener) {
    selectionListener = (StreetSelectionListener) activity;
    } else {
    throw new ClassCastException("Parent activity must implement StreetSelectionListener");
    }
    }
    @Override
    public void onDetach() {
    selectionListener = null;
    super.onDetach();
    }
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = new AlertDialog.Builder(getActivity()).setTitle("Street Selection")
    .setPositiveButton("OK", null).setNegativeButton("Cancel", new OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
    selectionListener.onStreetsUserCanceled();
    }
    }).create();
    return dialog;
    }
    @Override
    public void onCancel(DialogInterface dialog) {
    super.onCancel(dialog);
    selectionListener.onStreetsUserCanceled();
    }
    }
    Ambas soluciones no son agradables… 1. No funciona si está trabajando en anidados fragmentos, 2. Va a lanzar un nuevo cuadro de diálogo de modo que usted no puede hacer cualquier agradable transición / animación cuando los cambios de contenido.

    OriginalEl autor gunar

  2. 3

    La mejor manera de manejar de vuelta comportamiento en DialogFragment?

    La mejor manera de manejar la parte posterior comportamiento en un DialogFragment sería no meterse con él y dejarlo como está, volver a pensar en el proceso de su enfoque actual. Si estoy viendo un cuadro de diálogo en una aplicación y me echo estoy esperando pop el cuadro de diálogo fuera de la pantalla y no navegar entre el cuadro de diálogo páginas de(espero que no lo he leído mal tu pregunta).

    Hay una manera de hacer esto?

    En su DialogFragment usted podría utilizar una costumbre Dialog(estoy asumiendo que usted está utilizando sólo la onCreateDialog() de devolución de llamada para devolver el Dialog con las listas) para que se invalida la onKeyDown() de devolución de llamada para manejar la parte de atrás que está siendo presionado:

    public class CustomDialog extends Dialog {
    protected CustomDialog(Context context) {
    super(context);
    }
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
    //the back key was pressed so do something?
    return true;
    }
    return super.onKeyDown(keyCode, event);
    }
    }

    Yo también mirar en Google+ aplicación está mostrando ActionBar en el
    DialogFragment para proporcionar HomeAsUp pero no puedo encontrar ninguna información sobre ella.

    Siempre se puede hacer una Activity parecer un Dialog.

    Gracias. Yo uso DialogFragment como yo tal vez de usarlo como un Fragmento en la versión para tableta. Estoy trabajando en un faux-ActionBar en la parte superior de la DialogFragment por ahora.

    OriginalEl autor Luksprog

  3. 2
    The best way is to override onBackPressed() in the dialog , you created in onCreateDialog().
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
    return new Dialog(getActivity(), getTheme()){
    @Override
    public void onBackPressed() {
    //do your stuff
    }
    };
    }

    OriginalEl autor prince_sachdeva

Dejar respuesta

Please enter your comment!
Please enter your name here