我在使用DialogFragment时遇到一些问题。我的应用程序必须显示三个不同的对话框:一个带有数字选择器,另一个用于创建项目,另一个用于编辑项目。 我在这个活动中使用了viewpagerindicator,因此当我点击listview项目(片段)时,在操作栏(Activity)和其他人中调用创建项目的那个。
我创建了一个带有三个实例的DialogFragment,每个布局一个,我可以打开而不会出现问题。我也在Activity和Fragment中实现了接口。
我的问题是如何在我的片段中返回我的对话框,因为我在活动(对于第一个布局)和片段(对于另一个)中覆盖了“onDialogPositiveClick”两个布局)但它只在活动中被调用。
我的对话:
private static int idLayout;
private static Item myItem;
public interface MyDialogListener {
public void onDialogPositiveClick(SherlockDialogFragment dialog,
int layout);
public void onDialogPositiveClick(SherlockDialogFragment dialog,
int layout, ItemComanda item);
public void onDialogNegativeClick(SherlockDialogFragment dialog);
}
MyDialogListener bListener;
public static MyDialog newItem(String title) {
idLayout = R.layout.dialog_item;
MyDialog fragment = new MyDialog();
Bundle args = new Bundle();
args.putString("title", title);
fragment.setArguments(args);
return fragment;
}
public static MyDialog editItem(String title, Item item) {
idLayout = R.layout.dialog_item;
myItem = item;
MyDialog fragment = new MyDialog();
Bundle args = new Bundle();
args.putString("title", title);
args.putString("name", item.getNm_item());
args.putDouble("price", item.getVl_item());
fragment.setArguments(args);
return fragment;
}
public static MyDialog newNumberPicker(String title,
Item item, int max, int min) {
idLayout = R.layout.dialog_number_picker;
myItem = item;
MyDialog fragment = new MyDialog();
Bundle args = new Bundle();
args.putString("title", title);
args.putInt("value", item.getQuantity());
args.putInt("max", max);
args.putInt("min", min);
fragment.setArguments(args);
return fragment;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
bListener = (MyDialogListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " implement MyDialogListener");
}
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
LayoutInflater inflater = LayoutInflater.from(getActivity());
final View v = inflater.inflate(idLayout, null);
String title = getArguments().getString("title");
Dialog myDialog = new AlertDialog.Builder(getSherlockActivity())
.setTitle(title)
.setView(v)
.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
if (myItem == null) {
bListener.onDialogPositiveClick(
MyDialog.this, idLayout);
} else {
bListener.onDialogPositiveClick(
MyDialog.this, idLayout, myItem);
}
}
})
.setNegativeButton(android.R.string.cancel,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
bListener
.onDialogNegativeClick(MyDialog.this);
}
}).create();
switch (idLayout) {
case R.layout.dialog_number_picker:
numberPicker(v);
break;
case R.layout.dialog_bill_item:
itemDialog(v);
myDialog.getWindow().setSoftInputMode(
LayoutParams.SOFT_INPUT_STATE_VISIBLE);
break;
}
return myDialog;
}
private void itemDialog(View v) {
EditText txtName = (EditText) v.findViewById(R.id.txt_item_name);
EditText txtPrice = (EditText) v.findViewById(R.id.txt_item_price);
String name = getArguments().getString("name");
Double price = getArguments().getDouble("price", 0.0);
txtName.setText(name);
txtPrice.setText(String.valueOf(price));
txtName.requestFocus();
}
private void numberPicker(View v) {
int value = getArguments().getInt("value");
int max = getArguments().getInt("max");
int min = getArguments().getInt("min");
NumberPicker np = (NumberPicker) v.findViewById(R.id.numberPicker);
np.setMaxValue(max);
np.setMinValue(min);
np.setFocusable(false);
np.setFocusableInTouchMode(false);
np.setValue(value);
}