Расширяя CustomDialog, текст редактирования всегда пуст - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь добавить настраиваемое поле в IconDialog (https://github.com/maltaisn/icondialoglib)

Я добавил новый EditText в XML и пытаюсь получить к нему доступ в своей активности onIconDialogIconsSelected (которая является обратным вызовом при выборенажата кнопка этого диалога).

editText.getText () всегда пуст, но я вижу его при отладке в представлении.

Новый класс:

public class InputIconDialog extends IconDialog {
    private EditText editText;
    public InputIconDialog() {

    }

    public String getInputText() {
        View v = getLayoutInflater().inflate(R.layout.icd_dialog_icon, null);
        editText = v.findViewById(R.id.icd_edt_InputName); // this editText exists but is always empty
        return editText.getText().toString();
    }
}

1 Ответ

1 голос
/ 04 ноября 2019

Проблема здесь в том, что вы фактически не получаете доступ к представлению на дисплее. Вы надули новый View на нулевого родителя ViewGroup в этой строке View v = getLayoutInflater().inflate(R.layout.icd_dialog_icon, null);. Хотя представление было создано, оно не привязано ни к какому пользовательскому интерфейсу.

Другая проблема заключается в том, что в IconDialog вы уже установили содержимое диалога на представление dialog.setContentView(view);, которое вы там надули.


Простое решение состояло бы в том, чтобы позволить дочерним элементам IconDialog изменить базовую компоновку.

public class IconDialog extends DialogFragment {

    @LayoutRes
    protected int layoutRes = R.layout.icd_dialog_icon;

    Dialog onCreateDialog(final Bundle state) {
        LayoutInflater inflater = LayoutInflater.from(context);
        @SuppressLint("InflateParams") final View view = inflater.inflate(layoutRes, null);
}

public class InputIconDialog extends IconDialog {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        layoutRes = R.layout.icd_dialog_icon;
    }

Основным недостатком такого решения является его долговременное обслуживание в том смысле, чтодочерние элементы IconDialog должны включить все представления, от которых это зависит, в свой макет с <inclue или репликацией.


Рекомендация

Я бы использовал onCreateView в IconDialog, чтобы установить макет и представления, а затем переопределить его в InputIconDialog и вызвать super. Это плюс 3 файла макета, один для icon_dialog, один для общих видов между двумя диалогами и один для input_icon_dialog.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...