2013-12-17 3 views
8

Also habe ich eine DialogFragment Anzeige Bereich Auswahlliste. Sobald der Benutzer auf den Bereich klickt, ruft die Liste die Daten erneut auf, um die Auswahlliste für die Straße anzuzeigen. An dieser Stelle möchte ich dem Benutzer erlauben, die Hardware-Zurück-Taste zu drücken, um zur Bereichsauswahl zurückzukehren. Ist das möglich? Ich habe versucht, ein paar Methoden unten zu überschreiben, aber ich kann nur auf das Ereignis tippen, aber nicht verhindern, dass es passiert.Die beste Methode, um das Zurückverhalten von DialogFragment zu behandeln?

@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() erhalten, wenn Benutzer drücken Zurück-Taste genannt, aber selbst wenn ich Dialog nicht super.dismiss() nennen, unabhängig entlassen bekommen.

Gibt es eine Möglichkeit, dies zu tun? Ich schaue auch, wie App zeigt ActionBar in der DialogFragment zu HomeAsUp bereitstellen, aber ich kann keine Informationen darüber finden.

Antwort

5

Ich sehe zwei Lösungen:

Die einfachste: Have Bereichsauswahl und Straßenauswahlliste als beiden getrennten üblichen Fragmente und haben beide in einer separaten Aktivität und haben diese Aktivität als Dialog über ein einfaches Thema: <activity android:theme="@android:style/Theme.Dialog" /> und haben excludeFromRecents="true", um diese in den recents verwendeten Apps nicht zu haben. Die Bereichsauswahl wird zuerst geladen, dann fügen Sie die Straßenauswahl durch addToBackStack(null) hinzu, so dass Sie das Fragment AreaSelection darunter haben.

Wenn Sie aus irgendeinem Grund keine separate Aktivität dafür haben möchten, können Sie einen Dialoglistener von Ihrem Dialogfragment hinzufügen, und sein Implementor (die Aktivität) öffnet die AreaFragment.Mit einem grundlegenden Verständnis des Codes dieses einfache Projekt sollte es tun:

Der Eigentümer Aktivität:

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 (Ausweitung auf Ihre Bedürfnisse):

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(); 
    } 
} 

Und StreetSelectionFragment (wieder: erweitern Sie es auf Ihre Bedürfnisse):

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(); 
    } 
} 
+0

Beide Lösungen sind nicht nett ... 1. Funktioniert nicht, wenn Sie in verschachtelten Fragmenten arbeiten, 2. Wird ein neues Dialogfeld starten, so dass Sie keine schönen Übergänge/Animationen machen können, wenn sich der Inhalt ändert. – Ixx

3

Der beste Weg, um Verhalten auf DialogFragment zurück zu behandeln?

Der beste Weg, um das Verhalten zurück auf DialogFragment zu handhaben wäre es nicht Chaos mit ihm und lassen, wie es ist, in dem Prozess Ihren aktuellen Ansatz zu überdenken. Wenn ich einen Dialog in einer App sehe und zurückkomme, erwarte ich , um den Dialog aus dem Bildschirm und nicht zwischen den Seiten des Dialogs zu navigieren (ich hoffe, ich habe Ihre Frage nicht falsch gelesen) .

Gibt es eine Möglichkeit, dies zu tun?

In Ihrem DialogFragment Sie eine benutzerdefinierte verwenden könnte Dialog (ich Sie gehe davon sind nur die onCreateDialog() Rückruf mit der Dialog mit den Listen zurück), für die Sie die onKeyDown() Rückruf überschreiben die zurück zu handhaben gedrückt:

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); 
    } 

} 

ich kümmere mich auch darüber, wie Google+ App ActionBar im DialogFragment anzeigt HomeAsUp zu schaffen, aber ich kann keine Infos über ihn nicht finden.

Sie können eine Activity immer wie eine Dialog aussehen lassen.

+0

Danke. Ich verwende DialogFragment, weil ich es vielleicht als Fragment in der Tablet-Version verwende. Ich arbeite gerade an einer faux-ActionBar oben auf dem DialogFragment. – RobGThai

1
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 
     } 
    }; 
}