Приложение падает с API 27, но корректно работает с API 21

Я пытаюсь установить размер текста заголовка для DialogFragment
Я написал код для своего старого тестового устройства (Android 5.0 API 21), и все было в порядке
Но приложение падает после того, как я начал использовать новое тестовое устройство (Android 8.1 API 27). )

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_multiple_info_dialog, null, false);
    getDialog().setTitle(R.string.dialog_fragment_BAC_info_title);
    TextView title = getDialog().findViewById(android.R.id.title);
    title.setTextSize(30);
    title.setTextColor(getResources().getColor(R.color.white));

он попадает в строку setTextSize(30) с ошибкой

java.lang.NullPointerException: попытка вызвать виртуальный метод «void android.widget.TextView.setTextSize (float)» для нулевой ссылки на объект

Да, журнал говорит мне, что title == null
Я попытался заменить часть кода на onDialogCreate(Bundle saveInstanceState)...
Но то же самое - теперь приложение падает на ту же строку внутри onDialogCreate...
Есть идеи, как это исправить?
от Gradle

    compileSdkVersion 27
    minSdkVersion 21
    targetSdkVersion 27

person Kirguduck    schedule 18.11.2018    source источник
comment
Очевидно, получить титул на DialogFragment в наши дни довольно сложно. Взгляните на этот ответ. Мне пришлось сделать это, чтобы заставить его работать, но после того, как я это сделал, ваш код работает, как и ожидалось.   -  person Mike M.    schedule 18.11.2018
comment
Ага. меня устраивает. Большое спасибо   -  person Kirguduck    schedule 19.11.2018
comment
@МайкМ. но почему? почему он работал правильно с предыдущим устройством?   -  person Kirguduck    schedule 19.11.2018
comment
Не знаю. Я не копался в коде, и на данный момент я не могу провести какое-либо серьезное тестирование. Это была быстрая проверка и исправление. Я чувствовал себя виноватым за то, что ввел вас в заблуждение, когда перепутал свои вопросы ранее, поэтому я решил, что это меньшее, что я могу сделать. :-)   -  person Mike M.    schedule 19.11.2018


Ответы (2)


это может помочь, передайте размер текста, а также единицу измерения.

* @param unit The desired dimension unit.
 * @param size The desired size in the given units.
 *
 * @attr ref android.R.styleable#TextView_textSize
 */
public void setTextSize(int unit, float size)
person MR.Robot    schedule 18.11.2018

Спасибо Майку М.
правильное решение -
определить стиль для фрагмента диалога внутри onCreate() и установите параметры заголовка внутри методов onCreateDialog() класса DialogFragment

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(DialogFragment.STYLE_NORMAL, R.style.DialogFragmentStyle);
}

нужно добавить стиль в styles.xml

<style name="DialogFragmentStyle" parent="Theme.AppCompat.Light.Dialog">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">false</item>
    <item name="android:windowActionBar">false</item>
    <item name="android:windowNoTitle">false</item>
</style>

и после необходимости разработать диалог

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = super.onCreateDialog(savedInstanceState);
    TextView title = dialog.findViewById(android.R.id.title);  //here it works!
    title.setTextSize(30);
    title.setText(R.string.dialog_fragment_title);
    title.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
    title.setTextColor(getResources().getColor(R.color.orange));
    dialog.getWindow().setLayout(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    return dialog;
}
person Kirguduck    schedule 19.11.2018