我正在尝试通过 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 期间,尚未添加控件。另一件需要注意的是,这是在 a 中Fragment
,因此这可能是我无法在父活动中找到视图的原因。
是否可以像这样引用另一个控件?