2013-02-12 4 views
8

Метод AlertDialog класса AlertDialog позволяет указать пользовательское представление для диалогового окна. Существуют ли какие-либо ограничения в отношении того, какие элементы управления могут быть включены в это пользовательское представление?android AlertDialog setView rules

Кроме того, если мы установим пользовательский вид, можем ли мы добавлять кнопки, используя setPositiveButton(), setNegativeButton() и т. Д.?

ответ

28

Метод setView() класса AlertDialog позволяет указать пользовательское представление для диалогового окна. Существуют ли какие-либо ограничения в отношении того, какие элементы управления могут быть включены в это пользовательское представление?

setView() метод AlertDialog.Builder принимает любой класс простиралась от View (см это суб-классы и их суб-классы).

Это означает EditTexts, Buttons и т. Д. Но также макеты, которые простираются от viewGroups.

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

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

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    // Get the layout inflater 
    LayoutInflater inflater = 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.YourLayout, null)) 
     .setPositiveButton(AlertDialog.BUTTON_NEGATIVE, "Yes!", 
      new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int id) { 
        // 
       } 
     }) 
     .setNegativeButton(AlertDialog.BUTTON_NEGATIVE, "Cancel", 
      new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int id) { 
        LoginDialogFragment.this.getDialog().cancel(); 
       } 
     }); 
    return builder.create(); 
} 

UPDATE:

Этот ответ, кажется, чтобы получить какую-то новую деятельность с 2-х лет назад, и некоторые вещи изменились.

Я немного обновил код, чтобы улучшить форматирование, и добавил следующий совет из-за текущего состояния лучших практик.

AlertDialog определяет стиль и структуру вашего диалога, но вы должны использовать DialogFragment в качестве контейнера для вашего диалога. Класс DialogFragment предоставляет все элементы управления, необходимые для создания вашего диалога и управления его внешним видом, вместо вызова методов в объекте Dialog.

Приведенный выше пример подразумевается, когда вы расширяете DialogFragment и создаете AlertDialog в методе обратного вызова onCreateDialog().

+0

Я пытаюсь следовать ответ здесь. Однако всякий раз, когда я вхожу в строку 'LayoutInflater inflater = getLayoutInflater();' всегда получаю сообщение о том, что вызов метода требует параметра ** Bundle **. Я попытался использовать saveInstanceState из параметров onCreateDialog, но это вызвало новые ошибки. – Brian

+0

Возможно, вы находитесь внутри фрагмента и нуждаетесь в 'getActivity(). GetLayoutInflater()' или 'LayoutInflater.from (getActivity())' – Timmetje

2

Насколько я знаю, вы можете добавить что угодно в setView(). Положительные/отрицательные кнопки не будут затронуты.

3

В прилагаемой документации для AlertDialog никаких ограничений на то, что вы могли бы установить в представлении AlertDialog.

Таким образом, пользовательский вид займет свое место под заголовком диалога и над кнопками, которые не будут затронуты вообще.

0

TRY, этот пример

android.support.v7.app.AlertDialog.Builder adb = 
    new android.support.v7.app.AlertDialog.Builder(YoreActivity.this); 

    ViewGroup subView = (ViewGroup) getLayoutInflater().// inflater view 
         inflate(R.layout.yore_layout_alert, null, false); 

    try {// set data of yore layout 

    ((TextView) subView.findViewById(R.id.messageAlert))//get element TextView 
              .setText(SomeText);//set text 

    } catch (NullPointerException npe) { 
    npe.printStackTrace(); 
    } 

    adb.setPositiveButton("textPOSITIVE", new DialogInterface.OnClickListener() {//one method go 
    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     // TODO some code 
    } 
    });//one method end 

    final android.support.v7.app.AlertDialog alertDialog = 
     adb.setTitle(SomeText)// set ttile 
     .setView(subView).create();// add view in AlertDialog.Builder, and create AlertDialog 

    try { //two method go 

    ((Button) subView.findViewById(R.id.customPositivButton)) 
    .setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
     // TODO some code 
     alertDialog.dismiss(); 
     } 
    }); 

    } catch (NullPointerException npe) { 
    npe.printStackTrace(); 
    } //two method end 

    alertDialog.show(); //show in YoreActivity 
Смежные вопросы