diff --git a/pangutext-android/src/main/java/com/highcapable/pangutext/android/factory/PanguWidget.kt b/pangutext-android/src/main/java/com/highcapable/pangutext/android/factory/PanguWidget.kt index edac4e7..79e5cf1 100644 --- a/pangutext-android/src/main/java/com/highcapable/pangutext/android/factory/PanguWidget.kt +++ b/pangutext-android/src/main/java/com/highcapable/pangutext/android/factory/PanguWidget.kt @@ -65,16 +65,23 @@ internal object PanguWidget { val instance = view ?: name.let { // There will be commonly used view class names in the XML layout, which is converted here. if (!it.contains(".")) "android.widget.$it" else it - }.toClassOrNull()?.let { + }.toClassOrNull()?.let { viewClass -> // Avoid creating unnecessary components for waste. - if (it notExtends classOf()) return null - val twoParams = it.constructor { + if (viewClass notExtends classOf()) return null + val twoParams = viewClass.constructor { param(ContextClass, AttributeSetClass) }.ignored().get() - val onceParam = it.constructor { + val onceParam = viewClass.constructor { param(ContextClass) }.ignored().get() - twoParams.newInstance(context, attrs) ?: onceParam.newInstance(context) + // Catching when the attrs value initialization failed. + runCatching { twoParams.newInstance(context, attrs) }.onFailure { + Log.w(PangutextAndroidProperties.PROJECT_NAME, "Failed to create instance of $viewClass using (Context, AttributeSet).", it) + }.getOrNull() + // Try to initialize with the default constructor again, otherwise return null. + ?: runCatching { onceParam.newInstance(context) }.onFailure { + Log.w(PangutextAndroidProperties.PROJECT_NAME, "Failed to create instance of $viewClass, this process will be ignored.", it) + }.getOrNull() } // Ignore if the instance is not a [TextView]. if (instance !is TextView) return null