应用因API 27而掉线,但因API 21而正确

时间:2018-11-18 17:44:02

标签: android title dialogfragment

我正在尝试为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)'

是的,登录后告诉我标题== null
我试图将部分代码替换为onDialogCreate(Bundle savedInstanceState)...
但是同样的事情-现在应用程序位于onDialogCreate ...的同一行上。
有任何解决方法的想法吗?
来自Gradle

    compileSdkVersion 27
    minSdkVersion 21
    targetSdkVersion 27

2 个答案:

答案 0 :(得分:0)

  

这可能会有所帮助,传递文本大小以及单位。

_selectedIndex: Number,

答案 1 :(得分:0)

感谢Mike M.
正确的解决方法是
为onCreate()中的对话框片段定义样式,并在DialogFragment类的

的onCreateDialog()方法中设置标题参数
@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;
}