我看到了兩個解決方案:
最簡單的:擁有區域選擇和街道選擇列表作爲兩個獨立的平常片段,並有他們兩個在一個單獨的活動,並通過一個簡單的主題有這個活動作爲一個對話框: <activity android:theme="@android:style/Theme.Dialog" />
並且excludeFromRecents="true"
在最近使用過的應用程序中沒有這個。 先選擇區域選擇,然後通過addToBackStack(null)
添加街道選擇,以便在下面有AreaSelection
片段。
如果您不想因爲任何原因爲此單獨進行任何活動,則可以從dialogfragment及其實現者(活動)中添加一個對話框偵聽器,以打開AreaFragment
。隨着你的代碼的基本理解這個簡單的項目應該這樣做:
所有者活動:
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(其擴展到您的需要):
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();
}
}
而且StreetSelectionFragment
(再次:擴展到您的需求):
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();
}
}
這兩種解決方案都不好...... 1.如果您在嵌套片段中工作,則不起作用; 2.將啓動一個新的對話框,以便在內容更改時無法進行任何良好的過渡/動畫。 – Ixx