所有,
我有一个重写OnCreateDrawableState()
的ViewGroup子类(Xamarin.Android在C#中,因此请原谅Pascal Casing)。
但是,我对OnCreateDrawableState()
的覆盖从未被调用。我尝试调用RefreshDrawableState()
,DrawableStateChanged()
。 RequestLayout()
和Invalidate()
。
似乎没有任何作用。这是方法:
/// <summary>
/// Handles the create drawable state event by adding in additional states as needed.
/// </summary>
/// <param name="extraSpace">Extra space.</param>
protected override int[] OnCreateDrawableState (int extraSpace)
{
int[] drawableState = base.OnCreateDrawableState(extraSpace + 3);
if (Completed)
{
int[] completedState = new int[] { Resource.Attribute.completed };
MergeDrawableStates(drawableState, completedState);
}
if (Required)
{
int[] requiredState = new int[] { Resource.Attribute.required };
MergeDrawableStates(drawableState, requiredState);
}
if (Valid)
{
int[] validState = new int[] { Resource.Attribute.valid };
MergeDrawableStates(drawableState, validState);
}
Android.Util.Log.Debug("ROW_VIEW", "OnCreateDrawableState Called");
return drawableState;
}
我认为它可以正常工作-但它永远不会被调用。 ViewGroup本身嵌套在
ListView
和/或LinearLayout
中,但似乎无济于事。此related question没有对我有用的答案。
最佳答案
编辑:(假设您正在实现Checkable接口,则我编辑了先前的答案错误答案)
仅当子元素(叶)在Textview中声明例如android:duplicateParentState
时,OnCreateDrawableState才似乎从叶节点传播到其父节点(ViewGroups)。据我了解,如果设置了android:duplicateParentState="true"
,则RefreshDrawableState会从页面开始,而OnCreateDrawableState会从页面开始,但是我没有做过详尽的分析,可能会对任何指向文档的好的指针感兴趣。
以下布局作为ListView中的一项,将导致MyLinearLayout上的onCreateDrawableState被调用:
<com.example.android.MyLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
...>
<TextView
...
android:duplicateParentState="true"/>
</com.example.android.MyLinearLayout>
这不会:
<com.example.android.MyLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
...>
<TextView
...
android:duplicateParentState="false"/>
</com.example.android.MyLinearLayout>
这也不会(LinearLayout不会向上传播):
<com.example.android.MyLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
...>
<LinearLayout
...
android:duplicateParentState="false">
<TextView
...
android:duplicateParentState="true"/>
</LinearLayout>
</com.example.android.MyLinearLayout>
这将再次:
<com.example.android.MyLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
...>
<LinearLayout
...
android:duplicateParentState="true">
<TextView
...
android:duplicateParentState="true"/>
</LinearLayout>
</com.example.android.MyLinearLayout>
请注意,Checkable接口的实现似乎有些汞齐。
Checkable接口可以由ListView,GridView等中的直接子级视图实现。无需在视图树下进一步实现它。
在这种情况下,处于选择模式的ListView将在Checkable接口上调用setChecked:
http://androidxref.com/4.3_r2.1/xref/frameworks/base/core/java/android/widget/ListView.java#1899
if (mChoiceMode != CHOICE_MODE_NONE && mCheckStates != null) {
if (child instanceof Checkable) {
((Checkable) child).setChecked(mCheckStates.get(position));
}
Checkable的实现通常通过覆盖OnCreateDrawableState添加可绘制状态。请参阅我的其他帖子以获取以下示例:
MvxListView checkable list item