2016-10-26 6 views
6

Я успешно создал рабочую AlertDialog для моего Android приложения:Нужна помощь в получении пользовательского макета работать с моим Android AlertDialog

public class MyClass extends DialogFragment{ 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     ArrayList selectedItems = new ArrayList(); 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     builder.setTitle(R.string.pick_toppings) 
     builder.setMultiChoiceItems(R.array.my_array, null, new DialogInterface.OnMultiChoiceClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which, boolean isChecked) { 
       if (isChecked) { 
        selectedItems.add(which); 
       } else if (selectedItems.contains(which)) { 
        selectedItems.remove(Integer.valueOf(which)); 
       } 
      } 
     }); 
     builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int id) { 
       // do stuff here ... 
      } 
     }); 
     builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int id) { 
       // do stuff here ... 
      } 
     }); 

     return builder.create(); 
    } 
} 

Этот список MultiChoiceItems опирается на массив в /res/values/array.xml

<resources> 
    <array name="my_array"> 
     <item>item 01</item> 
     <item>item 02</item> 
     <item>item 03</item> 
     <item>item 04</item> 
     <item>item 05</item> 
    </array> 
</resources> 

С моей деятельности я вызываю AlertDialog следующим образом:

MyClass myClass = new MyClass(); 
myClass.show(getSupportFragmentManager(), "My Dialog"); 

Теперь я хочу использовать пользовательский макет с AlertDialog, чтобы я мог делать такие вещи, как чередование строк, настраиваемые кнопки и добавлять EditText, чтобы у меня была опция «другой» с возможностью заполнения "Другие".

После выполнения некоторых поисковых запросов, похоже, мне нужно создать новый макет и установить вид AlertDialog на этот макет. Таким образом, я создал макет:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <CheckBox 
     android:id="@+id/checkBox" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="other" 
     android:textSize="18sp"/> 
    <EditText 
     android:id="@+id/editText" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 
</LinearLayout> 

Затем я добавил это к моему классу DialogFragment:

LayoutInflater layoutInflater = getActivity().getLayoutInflater(); 
View view = layoutInflater.inflate(R.layout.my_new_layout, null); 

затем

builder.setView(view); 

Как вы можете догадаться, это не сработало. Новый CheckBox и EditText был вставлен после моих других флажков, которые были заполнены из моего массива, но выглядит ужасно, и я не вижу никакого контроля над появлением флажков, созданных из массива.

Как я уже сказал, я хотел бы добавить эту новую комбинацию CheckBox/EditText, а также иметь возможность настраивать внешний вид всего AlertDialog.

Я действительно хочу использовать массив от /res/values/array.xml, так что мне не нужно жестко кодировать новую опцию, если я хочу добавить новые элементы в список.

Является ли то, что я желаю сделать возможным? Если да, то некоторые советы будут замечательными.

Благодаря

Это то, что я хотел бы мой AlertDialog смотреть/акт как:

ответ

0

Ok, я, наконец, понял это сам.Вот мое решение:

Новый макет:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="right"> 
</LinearLayout> 

Новый класс:

public class MyClass extends DialogFragment{ 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     String[] theOptions = getResources().getStringArray(R.array.options); 

     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     builder.setTitle(R.string.pick_toppings) 

     LayoutInflater layoutInflater = getActivity().getLayoutInflater(); 
     LinearLayout view = (LinearLayout) layoutInflater.inflate(R.layout.my_layout, null); 

     for(String option : theOptions){ 
      CheckBox checkbox = new CheckBox(getContext()); 
      checkbox.setText(option); 
      view.addView(checkbox); 
     } 

     LinearLayout otherLinearLayout = new LinearLayout(getContext()); 
     otherLinearLayout.setOrientation(LinearLayout.HORIZONTAL); 
     otherLinearLayout.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 
     otherLinearLayout.setId(R.id.otherLinearLayout); 

     CheckBox otherCheckBox = new CheckBox(getContext()); 
     otherCheckBox.setText("other"); 
     otherCheckBox.setId(R.id.otherCheckBox); 

     EditText otherEditText = new EditText(getContext()); 
     otherEditText.setId(R.id.otherEditText); 

     otherLinearLayout.addView(otherCheckBox); 
     otherLinearLayout.addView(otherEditText); 

     view.addView(otherLinearLayout); 

     builder.setView(view); 

     builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int id) { 
       // do stuff here ... 
      } 
     }); 
     builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int id) { 
       // do stuff here ... 
      } 
     }); 

     return builder.create(); 
    } 
} 
+0

Мне любопытно, почему вы добавляете представления программно, а не только с помощью xml? Вы ничего особенного не делаете. –

+0

Потому что я хотел бы создать представления из потенциально меняющегося списка входов (т. Е. У меня может быть 5 сегодня, но 15 в следующем году). Таким образом, мне не нужно возвращаться и жестко кодировать еще 10 флажков для изменения; Мне просто нужно обновить массив в '/ res/values ​​/ array.xml', и все остальное обновляется автоматически. – Brian

+0

Имеет смысл, думаю, я пропустил цикл for в последний раз, читая его :) –

0

Вы можете сделать что-то вроде этого, получить массив, используя

String[] myarray = getResources().getStringArray(R.array.testArray); 

и создавание новые объекты флажков с использованием каждого элемента массива и установите его на завышенное представление

LinearLayout layout2 = new LinearLayout(context); layout2.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); 

и цикл по списку массива

layout2.addView(new Checkbox(context)); 

и, наконец, добавить родительский линейное расположение к надутым видом inflatedView.addView(layout2);

+0

Я следил за вами до тех пор, пока вы не «установили его в завышенном виде». Я до сих пор довольно новичок в разработке Android, и я не уверен на 100%, как настроить элементы представления кода на раздутый xml-макет. – Brian

+0

попробуйте что-то вроде этого –

+0

LinearLayout layout2 = new LinearLayout (контекст); layout2.setLayoutParams (новый LinearLayout.LayoutParams (LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); parent.setOrientation (LinearLayout.VERTICAL); и прокрутите список массивов layout2.addView (новый флажок (контекст)); и, наконец, добавить родительский макет Linar к завышенному виду inflatedView.addView (layout2); вы всегда можете вызвать методы addView для динамического добавления представлений в макет –

0

Создание пользовательского диалогового фрагмента и добавить все элементы и флажков внутри новый макет определяемый программным способом, то есть динамически. Запишите код для checkItemSelect edListener в вашем коде.