gpt4 book ai didi

android - 如何在通货膨胀期间从另一个控件中引用一个控件?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:00:40 24 4
gpt4 key购买 nike

我正在尝试通过 XML 引用同级控件。

声明一个属性以引用 MyTextView 中的 id:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MyTextView">
<attr name="valueTextViewId" format="reference" />
</declare-styleable>
</resources>

fragment_example.xml - 如何使用自定义属性:

<!-- Declare a "Title" text view that references a "Value" -->
<com.example.MyTextView
android:id="@+id/foo"
example:valueTextViewId="@id/bar"
... />

<!-- Depending on the "text" attribute of this "Value" textview -->
<!-- Do something within "Title" textview -->
<com.example.MyTextView android:id="@+id/bar" />

MyFragment.java - 膨胀控件

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
Bundle savedInstanceState) {
// calls MyTextView Ctor
View v = inflater.inflate(R.layout.fragment_example, container, false);
}

MyTextView 类构造函数 - 在膨胀期间对引用的 TextView 执行一些操作:

public TextView(Context context, AttributeSet attrs) {
super(context, attrs);

TypedArray a = ctx.obtainStyledAttributes(attrs, R.styleable.MyTextView);
int refId = a.getResourceId(R.styleable.MyTextView_valueTextViewId);

// Updated to use context
if (refId > -1 && context instanceof Activity) {
Activity a = (Activity)context;
View v = a.findViewById(refId);

// THE PROBLEM: v is null
if (v != null) {
// In my case, I want to check if the "Value" textview
// is empty. If so I will set "this" textColor to gray
}
}
}

在此示例中,v 始终为 null。我假设是因为在 Layout Inflation 期间,尚未添加控件。另一件需要注意的事情是,这是在 Fragment 中,因此这可能是我在父 Activity 中找不到 View 的原因。

是否可以像这样从另一个控件引用控件?

最佳答案

Is it possible to reference a control from another like this?

可以从一个View 引用另一个View

但是不建议在 Viewconstructor 中进行属性检查。
不能保证任何特定的 ViewView inflation 期间先于任何其他 View 实例化。 .

比较这两种布局:
first_layout.xml

<com.example.MyTextView
...
android:id="@+id/foo"
example:valueTextViewId="@+id/bar" />

<com.example.MyTextView
...
android:id="@+id/bar" />

second_layout.xml

<com.example.MyTextView
...
android:id="@+id/bar" />

<com.example.MyTextView
...
android:id="@+id/foo"
example:valueTextViewId="@+id/bar" />

在此示例中,很明显构造函数的属性检查在其中一种布局中不起作用。

我同意可以在 View 中存储对另一个 View 的引用:

public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyTextView);
mReferenceId = a.getResourceId(R.styleable.MyTextView_valueTextViewId);
...
}

private int mReferenceId;

public View getReferenceViewFromActivity() {
if (getContext() instanceof Activity) {
return ((Activity)getContext()).findViewById(mReferenceId);
return null;
}

public View getReferenceView(View view) {
return view.findViewById(mReferenceId);
}

但是您绝对应该在 ActivityFragment 中进行所有属性检查:

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
MyTextView myTextView = (MyTextView)view.findViewById(R.id.foo);
MyReferenceView refView = (MyReferenceView)myTextView.getReferenceView(view);
//
// do property checking
//
}

关于android - 如何在通货膨胀期间从另一个控件中引用一个控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16705378/

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