Диалог настройки, в котором есть элементы списка с одним выбором - PullRequest
8 голосов
/ 23 марта 2012

Я создал Диалог с элементами списка с одним выбором:

final CharSequence[] items = {"Red", "Green", "Blue"};

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Colors");
builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
          public void onClick(DialogInterface dialog, int item) {
                Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
            }
        });
AlertDialog alert = builder.create();
alert.show();

Как настроить макет этого диалогового окна таким образом, чтобы каждый элемент списка в диалоговом окне состоял из значка и текста. Как создать собственный макет для списка в диалоговом окне?

Ответы [ 3 ]

11 голосов
/ 23 марта 2012

Шаги для создания диалогового окна настройки:

  1. Создание файлов макета диалогового окна, например:

    <RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android"
    android:layout_width = "wrap_content"
    android:layout_height = "wrap_content">
    <!-- The Title Bar -->
    <LinearLayout
        android:id="@+id/dlg_priority_titlebar"
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true">
    
        <ImageView
            android:src="@drawable/image"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="5dip" />
    
        <TextView
            android:layout_width = "wrap_content"
                android:layout_height = "wrap_content"
                android:text = "Select Task Priority"
                android:layout_gravity = "center_vertical" />
    </LinearLayout>
    <ListView 
        android:id="@+id/dlg_priority_lvw"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/dlg_priority_titlebar"
        android:background="@drawable/layout_home_bg">
    </ListView>
    

  2. Поскольку макет в пользовательском ListView, поэтому создать файл макета для ListView:

    <LinearLayout xmlns: android = "http://schemas.android.com/apk/res/android" 
        android:orientation = "horizontal" 
        android:layout_width = "fill_parent" 
        android:layout_height = "fill_parent"> 
    
    <ImageView 
          android:id = "@+id/list_priority_img" 
          android:layout_width = "wrap_content" 
          android:layout_height = "wrap_content" 
          android:layout_gravity = "center_vertical" 
          android:layout_margin = "5dip" /> 
    <TextView 
         android:id = "@+id/list_priority_value" 
         android:layout_width = "wrap_content" 
         android:layout_height = "wrap_content" 
         android:layout_gravity = "center_vertical" 
         android:textsize = "28dip" 
         android:textColor = "@drawable/ black" /> 
    </LinearLayout>
    
  3. Создать пользовательский Dialog класс PriorityDlg, унаследованный отDialog

    открытый класс PriorityDlg расширяет диалог {

    private Context context;
    private ListView dlg_priority_lvw = null;
    public PriorityDlg(Context context) {
        super(context);
        this.context = context;
        // TODO Auto-generated constructor stub
    }
    public PriorityDlg(Context context, int theme) {
        super(context, theme);
        this.context = context;
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.dlg_priority);
        dlg_priority_lvw = (ListView) findViewById(R.id.dlg_priority_lvw);
        // ListView
        SimpleAdapter adapter = new SimpleAdapter(context, getPriorityList(),
                R.layout.lvw_priority, new String[] { "list_priority_img",
                        "list_priority_value" }, new int[] {
                        R.id.list_priority_img, R.id.list_priority_value });
        dlg_priority_lvw.setAdapter(adapter);
        //ListView
        dlg_priority_lvw
                .setOnItemClickListener(new AdapterView.OnItemClickListener() {
    
                    @Override
                    public void onItemClick(AdapterView<?> arg0, View arg1,
                            int arg2, long arg3) {
    
                    }
                });
    }
    private List<HashMap<String, Object>> getPriorityList() {
        List<HashMap<String, Object>> priorityList = new ArrayList<HashMap<String, Object>>();
        HashMap<String, Object> map1 = new HashMap<String, Object>();
        map1.put("list_priority_img", R.drawable.priority_not_important);
        map1.put("list_priority_value", context.getResources().getString(
                R.string.dlg_priority_not_important));
        priorityList.add(map1);
        HashMap<String, Object> map2 = new HashMap<String, Object>();
        map2.put("list_priority_img", R.drawable.priority_general);
        map2.put("list_priority_value", context.getResources().getString(
                R.string.dlg_priority_general));
        priorityList.add(map2);
        HashMap<String, Object> map3 = new HashMap<String, Object>();
        map3.put("list_priority_img", R.drawable.priority_important);
        map3.put("list_priority_value", context.getResources().getString(
                R.string.dlg_priority_important));
        priorityList.add(map3);
        HashMap<String, Object> map4 = new HashMap<String, Object>();
        map4.put("list_priority_img", R.drawable.priority_very_important);
        map4.put("list_priority_value", context.getResources().getString(
                R.string.dlg_priority_very_important));
        priorityList.add(map4);
    
        return priorityList;
    }
    

    }

  4. Для создания настраиваемого диалогового окна

    PriorityDlg dlg = new PriorityDlg (SimpleTaskActivity.this, R.style.dlg_priority); 
    dlg.show();
    

Где R.style.dlg_priority установить в диалоговом окне используется файл стиля, просто дайте диалоговому окну удалить строку заголовка, и, конечно, вы можете написать код для завершения этого эффекта:

<? Xml version = "1.0" encoding = "utf-8"?> 
<resources> 
    <style name="dlg_priority" parent="@android:Theme.Dialog"> 
        <item name = "android: windowNoTitle"> true </ item> 
    </ style> 
</ resources>
4 голосов
/ 17 сентября 2012

В основном вам нужно будет создать свой собственный ListAdapter путем создания подкласса одного из доступных классов адаптеров и передать его в диалог (используя builder.setAdapter(...)).Если у вас есть массив или список элементов / объектов, вы, вероятно, захотите рассмотреть подкласс ArrayAdapter.

В своем подклассе Adapter вы переопределяете метод getView(...) (среди прочих) изаполните представления вашего пользовательского макета данными для предоставленной позиции в списке.Точнее, вы захотите установить для изображения ImageView и для текста TextView.

 Create class `MySimpleArrayAdapter` extending from  `ArrayAdapter`. 

Используя метод ListView.setOnItemClickListener(), мы получим выбранное значение CheckTextView

#dialog.xml
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@color/whitebox_bg"
    android:orientation="horizontal" >

        <CheckedTextView
            android:id="@+id/textDialog"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:checkMark="?android:attr/listChoiceIndicatorSingle"
            android:gravity="center_vertical"
            android:maxLines="10"
            android:singleLine="false"
            android:text=""
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:textColor="#000000" />

</LinearLayout>

Для создания настраиваемого диалогового окна

        String [] view_location = {"Red", "Green", "Blue"};
              TextView label = (TextView) findViewById(R.id.selected_dept);
              AlertDialog.Builder builder = new AlertDialog.Builder(this);
              builder.setTitle("Select Location");
              ListView listview = new ListView(this);
              listview.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
                      LayoutParams.WRAP_CONTENT));
              listview.setCacheColorHint(0);
              listview.setBackgroundColor(Color.WHITE);


              if (view_location != null) {

                  MySimpleArrayAdapter choice_arrayAdapter = new MySimpleArrayAdapter(this, view_location,label.getText().toString());
                  listview.setAdapter(choice_arrayAdapter);
                  builder.setView(listview);

                  listview.setOnItemClickListener(new OnItemClickListener() {
                      @Override
                      public void onItemClick(AdapterView<?> arg0, View arg1,
                              int arg2, long arg3) {
                          // TODO Auto-generated method stub
                          TextView label = (TextView) findViewById(R.id.selected_dept);
                          label.setText(view_location[arg2]);
                          survedObjectId = view_location_id[arg2];
                          dInterface.dismiss();

                      }
                  });


              }
              Dialog dialog = builder.create();
              dInterface = dialog;
              dialog.getWindow().setLayout(200, 400);
              dialog.show();'

    // `Extends From ArrayAdapter

     'public class MySimpleArrayAdapter extends ArrayAdapter<String> {
             private final Context context;
             private final String[] values;
             private final String  selectedText;
             public MySimpleArrayAdapter(Context context, String[] values, String  selectedText) {
               super(context, R.layout.dialog_text, values);
               this.context = context;
               this.values = values;
               this.selectedText = selectedText;
             }

             @Override
             public View getView(int position, View convertView, ViewGroup parent) {
               LayoutInflater inflater = (LayoutInflater) context
                   .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
               View rowView = inflater.inflate(R.layout.dialog_text, parent, false);
               CheckedTextView textView = (CheckedTextView) rowView.findViewById(R.id.textDialog);

               textView.setText(values[position]);
               if(textView.getText().toString().equals(selectedText))
               {
                 textView.setChecked(true);
               }
               else
               {
                 textView.setChecked(false);
               }

               return rowView;
             }
           }'
0 голосов
/ 23 марта 2012

В основном вам нужно будет создать свой собственный ListAdapter путем создания подкласса одного из доступных классов адаптеров и указать его в диалоговом окне (используя builder.setAdapter(...)).Если у вас есть массив или список элементов / объектов, вероятно, вы захотите изучить подкласс ArrayAdapter.

В своем подклассе Adapter вы переопределяете метод getView(...) (среди прочих) и заполняетепредставления вашего пользовательского макета с данными для предоставленной позиции в списке.Точнее говоря, вы захотите настроить изображение для ImageView и текст для TextView.

Довольно хороший учебник, который демонстрирует, как реализовать пользовательский ArrayAdapter, и оказывается, что он близок к тому, что вы пытаетесьчтобы выполнить, можно найти здесь .Также показано, как использовать концепцию ViewHolder / RowWrapper.

...