I see two solutions:
The simplest: Have Area selection and Street selection list as both separate usual fragments and have both of them in a separate activity and have this activity as a dialog through a simple theme:
<activity android:theme="@android:style/Theme.Dialog" />
and have excludeFromRecents="true"
to not have this in the recents used apps.
Area selection is loaded first, then add street selection through addToBackStack(null)
so you'll have AreaSelection
fragment underneath.
If you don't want to have a separate activity for this for any reason, you could add a dialog listener from your dialogfragment and its implementor (the activity) will open the AreaFragment
. With a basic understanding of your code this simple project should do it:
The owner activity:
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 (extend it to your needs):
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();
}
}
And StreetSelectionFragment
(again: extend it to your needs):
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();
}
}