Приложение падает с API 27, но работает правильно с API 21 - PullRequest
0 голосов
/ 18 ноября 2018

Я пытаюсь установить размер текста заголовка для 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

Ответы [ 2 ]

0 голосов
/ 19 ноября 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;
}
0 голосов
/ 18 ноября 2018

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

* @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)
...