onCreateDrawableState 从未调用过

本文关键字:调用 onCreateDrawableState | 更新日期: 2023-09-27 18:29:59

All,

我有一个覆盖OnCreateDrawableState()的ViewGroup子类(Xamarin.Android是C#的,所以请原谅Pascal大小写(。

但是,我对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;
}

我认为它会正常工作 - 但它永远不会被调用。 视图组本身嵌套在ListView和/或LinearLayout中,但似乎没有任何帮助。

这个相关的问题没有适合我的答案。

onCreateDrawableState 从未调用过

编辑:(我编辑了我之前的答案错误答案,假设您正在实现可检查接口(

OnCreateDrawableState似乎只有在子元素(叶(声明android:duplicateParentState例如在Textview中时才从叶节点传播到它的父节点(ViewGroups(。据我了解,如果设置了android:duplicateParentState="true",RefreshDrawableState会下降到叶子,OnCreateDrawableState从叶子上升,但我还没有做彻底的分析,会对任何好的文档指针感兴趣。

以下布局作为列表视图中的项将导致调用 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>

这也不会(线性布局不会向上传播(:

<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>

请注意,似乎与可检查接口的实现有一些混合

可检查接口可以由列表视图、网格视图等中的直接子级视图实现。没有必要在视图树的下方进一步实现它。

在这种情况下,处于选择模式时的列表视图将在可检查界面上调用 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 来添加可绘制状态。有关这方面的示例,请参阅我的另一篇文章:Mvx列表视图可检查列表项