首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TypedArray.getText()在android.R.attr.text上返回null

TypedArray.getText()在android.R.attr.text上返回null
EN

Stack Overflow用户
提问于 2020-05-31 10:24:05
回答 2查看 881关注 0票数 0

我正在尝试实现一个使用StaticLayout的自定义文本视图。为了获得视图的'android:text‘属性,我在初始化字段中这样实现:

代码语言:javascript
运行
复制
@SupressLint("ResourceType")
class ExampleTextView(context: Context, attrs: AttributeSet?, defStyleAttr: Int): View(...) {
    private var mText: String

    init {
        val styledAttributes = context.obtainStyledAttributes(attrs, intArrayOf(
            ...
            android.R.attr.text,
            ...
        ))

        mText = styledAttributes.getText(1)
        ...

        styledAttributes.recycle()
    }
    ...
}

然后在布局xml中:

代码语言:javascript
运行
复制
<com.example.package.ExampleTextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="This is an example text" />

显然,我在自定义文本视图中设置了'android:text‘。但是,当我试图从TypedArray获取属性时,它返回null。使用styledAttributes.getString(1)的另一次尝试也会返回null。

堆栈跟踪:

代码语言:javascript
运行
复制
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.package, PID: 19154
    android.view.InflateException: Binary XML file line #10: Binary XML file line #10: Error inflating class com.example.package.ExampleTextView
    Caused by: android.view.InflateException: Binary XML file line #10: Error inflating class com.example.package.ExampleTextView
    Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Constructor.newInstance0(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
        at android.view.LayoutInflater.createView(LayoutInflater.java:647)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:790)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
        at com.example.package.adapter.elementsAdapter.onCreateViewHolder(PatchNoteElementsAdapter.kt:54)
        at androidx.recyclerview.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:7078)
        at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6235)
        at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6118)
        at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6114)
        at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2303)
        at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1627)
        at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587)
        at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:665)
        at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4134)
        at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3851)
        at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4404)
        at android.view.View.layout(View.java:20691)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at com.google.android.material.appbar.HeaderScrollingViewBehavior.layoutChild(HeaderScrollingViewBehavior.java:148)
        at com.google.android.material.appbar.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:43)
        at com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1996)
        at androidx.coordinatorlayout.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:918)
        at android.view.View.layout(View.java:20691)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at android.view.View.layout(View.java:20691)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1656)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1565)
        at android.view.View.layout(View.java:20691)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at android.view.View.layout(View.java:20691)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1656)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1565)
        at android.view.View.layout(View.java:20691)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
E/AndroidRuntime:     at com.android.internal.policy.DecorView.onLayout(DecorView.java:765)
        at android.view.View.layout(View.java:20691)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2806)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2333)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1473)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7215)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1004)
        at android.view.Choreographer.doCallbacks(Choreographer.java:816)
        at android.view.Choreographer.doFrame(Choreographer.java:751)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:990)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:280)
        at android.app.ActivityThread.main(ActivityThread.java:6706)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
     Caused by: kotlin.KotlinNullPointerException
        at com.example.package.ExampleTextView.<init>(ExampleTextView.kt:66)
        at com.example.package.ExampleTextView.<init>(ExampleTextView.kt:22)
            ... 67 more

我错过了什么吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-31 11:59:03

简短回答:按升序排序属性ID。

我找到了答案。这是因为IntArray的顺序在context.obtainStyledAttributes()上作为参数传递。

当我定义styledAttributes时,我这样写:

代码语言:javascript
运行
复制
val styledAttributes = context.obtainStyledAttributes(attrs, intArrayOf(
    android.R.attr.fontFamily,
    android.R.attr.text,
    android.R.attr.textSize,
    android.R.attr.textColor,
    android.R.attr.textAlignment,
    android.R.attr.lineSpacingExtra
))

根据以上所述,styledAttributes没有接到命令。当我们通过android文档(Ctrl+Q)检查常量值时,我们可以知道这一点。与此相等:

代码语言:javascript
运行
复制
val styledAttributes = context.obtainStyledAttributes(attrs, intArrayOf(
    16843692,
    16843087,
    16842901,
    16842904,
    16843697,
    16843287
))

虽然我没有在这个问题中讨论,但当我试图获得textSize和lineSpacingExtra的值时,我也得到了null。

为什么?因为当obtainStyledAttributes使用无序列表调用时,无论您做什么,属性值都是空的;getText()、getString()、getDimension()、getFont()、getResourceId()等等.如果属性常数的下一个值小于以前的值,则为.

这就是为什么当我试图获得属性值常数16843087,16842901,16843287时,它比以前的值小;16843692,16843087,16843697。

此外,根据引用,他们显然是说属性常量数组必须按升序排序。[https://developer.android.com/reference/android/content/res/Resources.Theme#obtainStyledAttributes(android.util.AttributeSet,%20int[],%20int,%20int)](https://developer.android.com/reference/android/content/res/Resources.Theme#obtainStyledAttributes(android.util.AttributeSet,%20int%5B%5D,%20int,%20int%29)

来说,它是样式中想要的属性。这些属性in必须按升序排序。此值不能为空。

因此,要正确获取属性值,我应该这样做:

代码语言:javascript
运行
复制
val styledAttributes = context.obtainStyledAttributes(attrs, intArrayOf(
    android.R.attr.textSize,
    android.R.attr.textColor,
    android.R.attr.text,
    android.R.attr.lineSpacingExtra,
    android.R.attr.fontFamily,
    android.R.attr.textAlignment
))

按升序排列得很好。希望这对未来的读者有所帮助。

票数 3
EN

Stack Overflow用户

发布于 2020-05-31 11:13:52

我导入了您的TextView,并发现了与

java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet]

我怀疑这与attrs设置的方式有关

通常,当我扩展泛型视图时,我会公开所有可用的构造函数,尝试一下。

代码语言:javascript
运行
复制
class ExampleTextView: View {
    constructor(context: Context): super(context)
    constructor(context: Context, attrs: AttributeSet?): super(context, attrs) {
        this.attrs = attrs
    }
    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int): super(context, attrs, defStyleAttr) {
        this.attrs = attrs
    }

    private var mText: String
    private var attrs: AttributeSet? = null

    init {
        val styledAttributes = context.obtainStyledAttributes(attrs, intArrayOf(android.R.attr.text))
        mText = styledAttributes.getText(1).toString()
        styledAttributes.recycle()
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62114763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档