onCreateDrawableState从不调用

时间:2013-09-03 16:05:40

标签: c# android xamarin.android viewgroup statelistdrawable

所有

我有一个ViewGroup子类覆盖OnCreateDrawableState()(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没有对我有用的答案。

1 个答案:

答案 0 :(得分:1)

编辑:(我编辑了我之前的答案错误答案,假设您正在实施Checkable界面)

只有当子元素(leaf)在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等中的直接子节点的Views实现。不需要在视图树下进一步实现它。

在这种情况下,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