我怎样才能在android中进行这样的对话?

时间:2012-10-12 15:09:12

标签: android dialog

我想实现这样的对话

enter image description here 用户点击按钮“图标”,此对话框打开,用户按下它选择适当的图标,然后对话框关闭并返回给我这个图标的ID。

我怎么能这样做?

感谢。

3 个答案:

答案 0 :(得分:0)

我建议你“模仿”对话框而不是使用android对话框。 为此,您可以创建第二个布局,其中包含深灰色背景和所有可点击的图标。当您调用对话框时,将调光设置为主布局,并将图标放在顶部。

我在我的应用中使用此功能。我将在10分钟内为您提供一些代码。

答案 1 :(得分:0)

查看API演示应用中的片段部分。您可以使用一些对话框

答案 2 :(得分:0)

您要创建一个带有自定义网格的alertDialog。在我的回答中,我认为OP通常想知道如何创建这样的对话框。因此,我使用的是普通样式。如果要使用深色样式,请创建自定义样式,然后在AlertDialog.Builder中使用它:

AlertDialog.Builder builder = new AlertDialog.Builder(context, <YourCustomStyle>);

结果:

AlertDialogChooseIcon

  1. 为单个条目创建布局。由于OP仅显示图标,因此我仅使用ImageView。例如,如果图标下应有文字,则只需在其下创建一个TextView并用文字填充即可。

view_icon_chooser_entry.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

<ImageView
    android:id="@+id/image_choose_icon_entry"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginBottom="8dp"
    android:layout_marginEnd="8dp"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    android:contentDescription="@null"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"/>

</android.support.constraint.ConstraintLayout>
  1. 创建一个可以处理数据并创建布局的适配器。在我的示例中,我从BaseAdapter开始扩展,因为这很容易做到。比较现代的做法是使用RecyclerView并为其创建自己的自定义适配器。

AlertDialogImageAdapter.java:

public class AlertDialogImageAdapter extends BaseAdapter {
    private LayoutInflater layoutInflater;

    AlertDialogImageAdapter(Context context) {
        layoutInflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return iconList.length;
    }

    @Override
    public Object getItem(int position) {
        return iconList[position];
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @SuppressLint("InflateParams")
    @NonNull
    public View getView(int position, View convertView, @NonNull ViewGroup parent) {
        AlertDialogViewHolder alertDialogViewHolder;

        if (convertView == null) {
            // This is an alertDialog, therefore it has no root
            convertView = layoutInflater.inflate(R.layout.view_icon_chooser_entry, null);

            DisplayMetrics metrics = convertView.getResources().getDisplayMetrics();
            int screenWidth = metrics.widthPixels;

            convertView.setLayoutParams(new GridView.LayoutParams(screenWidth / 6, screenWidth / 6));
            alertDialogViewHolder = new AlertDialogViewHolder();
            alertDialogViewHolder.icon = convertView.findViewById(R.id.image_choose_icon_entry);
            convertView.setTag(alertDialogViewHolder);
        } else {
            alertDialogViewHolder = (AlertDialogViewHolder) convertView.getTag();
        }

        alertDialogViewHolder.icon.setAdjustViewBounds(true);
        alertDialogViewHolder.icon.setScaleType(ImageView.ScaleType.CENTER_CROP);
        alertDialogViewHolder.icon.setPadding(8, 8, 8, 8);
        alertDialogViewHolder.icon.setImageResource(iconList[position]);
        return convertView;
    }

    // This is your source for your icons, fill it with your own
    private Integer[] iconList = {
            android.R.drawable.ic_media_play, android.R.drawable.ic_media_pause,
            android.R.drawable.ic_delete, android.R.drawable.ic_btn_speak_now,
            android.R.drawable.ic_media_previous, android.R.drawable.ic_media_next,
            android.R.drawable.ic_menu_my_calendar, android.R.drawable.ic_menu_agenda,
            android.R.drawable.ic_media_play, android.R.drawable.ic_media_pause,
            android.R.drawable.ic_delete, android.R.drawable.ic_btn_speak_now,
            android.R.drawable.ic_media_previous, android.R.drawable.ic_media_next,
            android.R.drawable.ic_menu_my_calendar, android.R.drawable.ic_menu_agenda,
            android.R.drawable.ic_media_play, android.R.drawable.ic_media_pause,
            android.R.drawable.ic_delete, android.R.drawable.ic_btn_speak_now,
            android.R.drawable.ic_media_previous, android.R.drawable.ic_media_next,
            android.R.drawable.ic_menu_my_calendar, android.R.drawable.ic_menu_agenda
    };

    private class AlertDialogViewHolder {
        ImageView icon;
    }
}
  1. 然后,放置使用自定义AlertDialog创建新的AlertDialogImageAdapter的方法,并使用网格作为布局。您可以使用setNumColumns(4)更改多少列。

将此方法放在您要显示警报对话框的位置,然后简单地调用它:

private void showAlertDialog(Context context) {
    GridView gridView = new GridView(context);
    gridView.setAdapter(new AlertDialogImageAdapter(context));
    gridView.setNumColumns(4);
    gridView.setGravity(Gravity.CENTER);
    gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            // TODO: Implement
            Toast.makeText(view.getContext(), "Clicked position is: " + position, Toast.LENGTH_LONG).show();
        }
    });

    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder.setView(gridView);
    builder.setTitle(R.string.title_chose_icon);
    builder.show();
}