自定义对话框片段
Posted
技术标签:
【中文标题】自定义对话框片段【英文标题】:Custom Dialog Fragment 【发布时间】:2014-04-08 11:37:27 【问题描述】:我正在尝试创建一个类似于DatePickerDialog
的简单对话框。我正在创建的Dialog
应该为用户提供一组可供他们选择的图像。
我相信我已经设法创建了数组并向其中添加了正确的图像,我现在遇到的问题是如何让Dialog
出现?我应该返回什么?
我已经研究了AlertDialogs
等,但我不确定如何实现它们。
已更新:已修复问题,下面显示的代码正在运行
图片选择器
public class PicturePickerFragment extends DialogFragment
ArrayList<Integer> imageList = new ArrayList<Integer>();
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
// fill an array with selected images
String title = "Picture";
imageList.add(R.drawable.barbershop);
imageList.add(R.drawable.wedding);
imageList.add(R.drawable.meeting);
imageList.add(R.drawable.barbershop);
// return alertdialog
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = getActivity().getLayoutInflater();
// Inflate and set the layout for the dialog
// Pass null as the parent view because its going in the dialog layout
builder.setView(inflater.inflate(R.layout.activity_create, null))
.setTitle(R.string.event_type)
.setPositiveButton(R.string.select_picture,
new DialogInterface.OnClickListener()
@Override
public void onClick(DialogInterface dialog,
int which)
// call the method on the parent activity when
// user click the positive button
);
return builder.create();
供参考
public class DatePickerFragment extends DialogFragment implements
DatePickerDialog.OnDateSetListener
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
// Use the current date as the default date in the picker
final Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
// Create a new instance of DatePickerDialog and return it
return new DatePickerDialog(getActivity(), this, year, month, day);
public void onDateSet(DatePicker view, int year, int month, int day)
// Do something with the date chosen by the user
month++;
String dateString = month + "/" + day + "/" + year;
Button b = (Button) getActivity().findViewById(R.id.btn_date);
b.setText(dateString);
片段将像这样使用
<Button
android:id="@+id/btn_picture"
android:layout_
android:layout_
android:layout_marginBottom="15dp"
android:layout_marginTop="15dp"
android:layout_weight="1"
android:background="@null"
android:drawablePadding="15dp"
android:onClick="showPicturePickerDialog"
android:drawableTop="@drawable/ico_picture"
android:text="Picture"
android:textColor="@color/darkbrown"
android:textSize="20sp" />
【问题讨论】:
请参考developer.android.com/reference/android/app/DialogFragment.html这个链接并在发布问题之前做谷歌 【参考方案1】:如果您要在其中打开DialogFragment
的活动扩展FragmentActivity
,您应该执行:
PicturePickerFragment dialog = new PicturePickerFragment();
dialog.show(getSupportFragmentManager(), "YourDialog");
您还需要在对话框片段类的方法onCreateDialog
中扩充对话框布局文件。
使用AlertDialog.Builder
,您可以轻松实现这一切,例如
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = getActivity().getLayoutInflater();
// Inflate and set the layout for the dialog
// Pass null as the parent view because its going in the dialog layout
builder.setView(inflater.inflate(R.layout.dialoglayout, null))
.setTitle(R.string.dialog_title)
.setPositiveButton(R.string.pos_button, new DialogInterface.OnClickListener()
@Override
public void onClick(DialogInterface dialog, int which)
// call the method on the parent activity when user click the positive button
)
.setNegativeButton(R.string.neg_button, new DialogInterface.OnClickListener()
@Override
public void onClick(DialogInterface dialog, int which)
// call the method on the parent activity when user click the negative button
);
return builder.create();
http://developer.android.com/reference/android/app/DialogFragment.html上有很多例子
【讨论】:
完美。我现在希望添加一组用户可以从中选择的图片。当我使用 .setView() 时,我应该使用一个包含一组图像的 ListView 的布局还是什么? 是的,您的对话框布局应该包含一个 ListView。您可以使用扩展 ArrayAdapter 的自定义适配器填充列表,其中包含您的图像数组。如果您需要帮助,请提出另一个问题,这是一个完全不同的主题:)【参考方案2】:有不同的方法可以使用OnCreateView
方法或OnCreateDialog
方法(如果您正在扩展DialogFragment
类)创建对话框,因此两者的实现方式不同。
您应该从 OnCreateDialog
方法返回您的 Dialog
实例。
如何在Activity
中显示对话框
FragmentTransaction ft = getFragmentManager().beginTransaction();
Fragment prev = getFragmentManager().findFragmentByTag("YourFragmentID");
if (prev != null)
ft.remove(prev);
ft.addToBackStack(null);
PicturePickerFragment pf = new PicturePickerFragment();
pf.show();
也许你可以参考这个link,这是AndroidDeveloper官方网站上的一个很好的例子。
【讨论】:
以上是关于自定义对话框片段的主要内容,如果未能解决你的问题,请参考以下文章
自定义对话框片段内的进度条 - 如何从 AsyncTask 传递进度?