gpt4 book ai didi

android - 如何将 View 引用传递给android自定义 View ?

转载 作者:IT老高 更新时间:2023-10-28 23:05:16 26 4
gpt4 key购买 nike

我是这样做的

1) 创建样式

<declare-styleable name="Viewee">
<attr name="linkedView" format="reference"/>
</declare-styleable>

2) 定义自定义 View 布局

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#ffc0">
<TextView
android:id="@+id/custom_text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="[text]"
/>
</LinearLayout>

3) 创建所需的类

public class Viewee extends LinearLayout
{
public Viewee(Context context, AttributeSet attributeSet)
{
super(context, attributeSet);
View.inflate(context, R.layout.viewee, this);
TextView textView = (TextView) findViewById(R.id.custom_text);
TypedArray typedArray = context.obtainStyledAttributes(attributeSet, R.styleable.Viewee);
int id = typedArray.getResourceId(R.styleable.Viewee_linkedView, 0);
if (id != 0)
{
View view = findViewById(id);
textView.setText(((TextView) view).getText().toString());
}

typedArray.recycle();
}
}

最后在下面的 Activity 中

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res/com.ns"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tvTest"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="android"/>
<com.ns.Viewee
android:layout_width="fill_parent"
android:layout_height="fill_parent"
app:linkedView="@+id/tvTest"
/>
</LinearLayout>

现在虽然我在 Viewee 构造器中收到一个非零 id,但 findViewById(id) 会返回 null 并且会发生 NullPointerException

我错过了什么?

I did it as described here

最佳答案

我找到了答案!

问题在于 findViewById(id) 以及我调用它的位置。 findViewById 仅查找 subview ,而不是上层级存在的 View documentation说。所以我必须调用类似 getRootView().findViewById(id) 之类的东西,但它也会返回 null 因为我调用它的地方不正确。

Viewee 中,构造器 Viewee 本身尚未附加到其根,因此调用会导致 NullPointerException

因此,如果我在构建后在其他地方调用 getRootView().findViewById(id) ,它可以正常工作,并且 "@+id/tvTest"“@id/tvTest” 是正确的。我已经测试过了!

答案如下

public class Viewee extends LinearLayout
{
public Viewee(Context context, AttributeSet a)
{
super(context, attributeSet);
View.inflate(context, R.layout.main6, this);
TextView textView = (TextView) findViewById(R.id.custom_text);
TypedArray t = context.obtainStyledAttributes(a, R.styleable.Viewee);
int id = t.getResourceId(R.styleable.Viewee_linkedView, 0);
if (id != 0)
{
_id = id;
}

t.recycle();
}

private int _id;

public void Foo()
{
TextView textView = (TextView) findViewById(R.id.custom_text);
View view = getRootView().findViewById(_id);
textView.setText(((TextView) view).getText().toString());
}
}

Foo 在需要通过其在 Activity 中其他地方的引用 ID 等处理附加 View 时被调用。

功劳完全归功于那些在 this post 中做出贡献的人.在提交问题之前我没有看到那个帖子。

关于android - 如何将 View 引用传递给android自定义 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11039829/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com