Проблема здесь в том, что вы фактически не получаете доступ к представлению на дисплее. Вы надули новый 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.