Передайте атрибут textAppearance в пользовательский вид и извлеките гарнитуру - PullRequest
0 голосов
/ 05 октября 2019

Я отображаю текст в своем пользовательском представлении.

Чтобы настроить гарнитуру, я передаю атрибут textappearance через xml:

<at.guger.strokepiechart.StrokePieChart
        android:id="@+id/mStrokePieChart"
        android:layout_width="200dp"
        android:layout_height="200dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:text="@string/StrokePieChart"
        app:textAppearance="?attr/textAppearanceBody1"
        app:textColor="@android:color/black"
        app:textSize="24sp" />

Я разрешаю эти параметры вМетод инициализации моего представления:

init {
    val typedArray = context.obtainStyledAttributes(attrs, R.styleable.StrokePieChart)

    density = context.resources.displayMetrics.density
    defaultSize = (DEFAULT_SIZE * density).roundToInt()
    strokeWidth = typedArray.getDimension(R.styleable.StrokePieChart_strokeWidth, strokeWidth * density)
    roundEdges = typedArray.getBoolean(R.styleable.StrokePieChart_roundedEdges, false)
    text = typedArray.getString(R.styleable.StrokePieChart_text)
    textSize = typedArray.getDimension(R.styleable.StrokePieChart_textSize, 0.0f).takeIf { it > 0 }
    textColor = typedArray.getColor(R.styleable.StrokePieChart_textColor, Color.WHITE)

    val textAppearanceResId = typedArray.getResourceId(R.styleable.StrokePieChart_textAppearance, -1)
    typeface = textAppearanceResId.takeIf { it > 0 }?.let { ResourcesCompat.getFont(context, it) }

    color = typedArray.getColor(R.styleable.StrokePieChart_defaultColor, Color.BLACK)

    typedArray.recycle()
}

Но этот подход приводит к следующей ошибке:

android.view.InflateException: строка двоичного файла XML № 22: строка двоичного файла XML № 22: Ошибка надувания класса at.guger.strokepiechart.StrokePieChart Причина: android.view.InflateException: строка двоичного XML-файла # 22: Ошибка надувания класса at.guger.strokepiechart.StrokePieChart Вызывается: java.lang.reflect.InvocationTarge. lang.reflect.Constructor.newInstance0 (собственный метод) в java.lang.reflect.Constructor.newInstance (Constructor.java:343) в android.view.LayoutInflater.createView (LayoutInflater.java:647) в android.view.LayoutInflater. createViewFromTag (LayoutInflater.java:790) в android.view.LayoutInflater.createViewFromTag (LayoutInflater.java:730) в android.view.LayoutInflater.rInflate (LayoutInflater.java:863) в android.view.LayoutInflater.rInflateChildren (LayoutInflater.java:824) в android.view.LayoutInflater.inflate (LayoutInflater.java:515) в android.view.LayoutInflater.inflate (LayoutInflater (LayoutInflater.inflate): 423) в androidx.fragment.app.Fragment.onCreateView (Fragment.java:1660) в androidx.fragment.app.Fragment.performCreateView (Fragment.java:2600) в androidx.fragment.app.FragmentManagerImpl.moveToState (FragmentManagerImpl. java: 881) в androidx.fragment.app.FragmentManagerImpl.addAddedFragments (FragmentManagerImpl.java:2100) в androidx.fragment.app.FragmentManagerImpl.executeOpsTogether (FragmentManagerImpl.javaImpra. .java: 1830) в androidx.fragment.app.FragmentManagerImpl.execPendingActions (FragmentManagerImpl.java:1727) в androidx.fragment.app.FragmentManagerImpl $ 2.run (FragmentManagerImpl.java:150) в android.os.Hall.java: 873) на android.os.Handler.dispatchMessage (Handler.java:99) на android.os.Looper.loop (Looper.java:193) на android.app.ActivityThread.main (ActivityThread.java:6718) на java.lang.reflect.Method. invoke (собственный метод) на com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java:493) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:858). Вызывается: android. content.res.Resources $ NotFoundException: идентификатор ресурса # 0x7f100162 в android.content.res.ResourcesImpl.getValue (ResourcesImpl.java:216) в android.content.res.Resources.getValue (Resources.java:1331) в androidx.core.content.res.ResourcesCompat.loadFont (ResourcesCompat.java:360) в androidx.core.content.res.ResourcesCompat.getFont (ResourcesCompat.java:230) в at.guger.strokepiechart.StrokePieChart. (StrokePieChart.)at.guger.strokepiechart.StrokePieChart. (StrokePieChart.kt: 33) at at.guger.strokepiechart.StrokePieChart. (Неизвестный источник: 6)

...