我试图建立对象之间的关系层次结构。每个对象都具有与其自身或null
相同类型的父对象。
我有一个包含以下内容的main.xml
:
<com.morsetable.MorseKey
android:id="@+id/bi"
android:layout_weight="1"
custom:code=".."
custom:parentKey="@id/be"
android:text="@string/i" />
res/values/attrs.xml
包含以下之一:<declare-styleable name="MorseKey">
<attr name="code" format="string"/>
<attr name="parentKey" format="reference"/>
</declare-styleable>
和一个包含以下内容的类(不是我的活动):
public class MorseKey extends Button {
public MorseKey(Context context, AttributeSet attrs) {
super(context, attrs);
initMorseKey(attrs);
}
private void initMorseKey(AttributeSet attrs) {
TypedArray a = getContext().obtainStyledAttributes(attrs,
R.styleable.MorseKey);
final int N = a.getIndexCount();
for (int i = 0; i < N; i++) {
int attr = a.getIndex(i);
switch (attr)
{
case R.styleable.MorseKey_code:
code = a.getString(attr);
break;
case R.styleable.MorseKey_parentKey:
parent = (MorseKey)findViewById(a.getResourceId(attr, -1));
//parent = (MorseKey)findViewById(R.id.be);
Log.d("parent, N:", ""+parent+","+N);
break;
}
}
a.recycle();
}
private MorseKey parent;
private String code;
}
这不起作用。每个
MorseKey
实例报告N == 2
(好)和parent == null
(坏)。即使我明确尝试将其设置为某个任意值,也可以使用parent == null
(请参见注释)。我也尝试了custom:parentKey="@+id/be"
(带有加号),但这也不起作用。我究竟做错了什么? 最佳答案
如果您的MorseKey类位于单独的java文件中,那么我认为您的陈述“一个类(不是我的活动)”就是这种情况。然后,我相信问题出在您使用findViewById()。 findViewById()将在MorseKey视图本身而不是main.xml文件中查找资源。
也许尝试获取MorseKey实例的父级并调用parent.findViewById()。
case R.styleable.MorseKey_parentKey:
parent = this.getParent().findViewById(a.getResourceId(attr, -1));
虽然只有在您的MorseKey父级和子级处于同一布局中时,这才起作用。
<LinearLayout ...>
<MorseKey ..../><!-- parent -->
<MorseKey ..../><!-- child -->
</LinearLayout>
但是,如果您的布局是这样的,那么父视图和子视图位于单独的布局中,则很难找到视图。
<LinearLayout ...>
<MorseKey ..../><!-- parent -->
</LinearLayout>
<LinearLayout ...>
<MorseKey ..../><!-- child -->
</LinearLayout>