Как получить элементы (findViewById) для макета, который динамически загружается (setView) в диалоговом окне?

Мне нужно получить EditText, который определен в макете xml, который динамически загружается как представление в диалоговом окне предпочтений, то есть:

public class ReportBugPreference extends EditTextPreference {

    @Override
    protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
        super.onPrepareDialogBuilder(builder);   
        builder.setView(LayoutInflater.from(ctx).inflate(R.layout.preference_report_bug_layout,null));
        EditText edttxtBugDesc = (EditText) findViewById(R.id.bug_description_edittext); // NOT WORKING
    }

}

ИЗМЕНИТЬ: РЕШЕНИЕ by jjnFord

@Override
protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
    super.onPrepareDialogBuilder(builder);  

    View viewBugReport = LayoutInflater.from(ctx).inflate(R.layout.preference_report_bug,null);
    EditText edttxtBugDesc = (EditText) viewBugReport.findViewById(R.id.bug_description_edittext);

    builder.setView(viewBugReport);



}

Ответ 1

Поскольку вы расширяете EditTextPreference, вы можете просто использовать метод getEditText() для захвата текстового представления по умолчанию. Однако, поскольку вы настраиваете свой собственный макет, это, вероятно, не будет делать то, что вы ищете.

В вашем случае вы должны наполнить ваш XML-макет в объект View, а затем найти editText в представлении - тогда вы можете передать свое представление строителю. Не пробовал это, но, просто глядя на ваш код, я бы подумал, что это возможно.

Что-то вроде этого:

View view = (View) LayoutInflater.from(ctx).inflate(R.layout.preference_report_bug_layout, null);
EditText editText = view.findViewById(R.id.bug_description_edittext);
builder.setView(view);

Ответ 2

LayoutInflater необходим для создания (или заполнения) представления на основе XML файла в во время выполнения. Например, если вам нужно динамически генерировать представления для ваши элементы ListView. Что такое надувной модуль в приложении для Android?

  • Создайте свой LayoutInflater:

LayoutInflater inflater = getActivity().getLayoutInflater();

  1. Создайте свой просмотр с помощью надувателя, ссылающегося на ваш_xml_файл:

View view= inflater.inflate(R.layout.your_xml_file, null);

  1. Найдите свой объект в своем макете по id.

TextView textView = (TextView)view.findViewById(R.id.text_view_id_in_your_xml_file);

  1. Используйте свой объект: i.e.

textView.setText("Hello!");