1

全て、

オーバーライドする ViewGroup サブクラスがありますOnCreateDrawableState()(Xamarin.Android は C# にあるため、パスカル ケーシングを許してください)。

ただし、私のオーバーライド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 自体はListViewand/or にネストされてLinearLayoutいますが、何も役に立たないようです。

この関連する質問には、私にとって有効な回答がありません。

4

1 に答える 1

1

編集:(Checkableインターフェースを実装していると仮定して、以前の回答の間違った回答を編集しました)

OnCreateDrawableState は、たとえば Textview で子要素 (リーフ) が宣言されている場合にのみ、リーフ ノードからその親ノード (ViewGroups) まで伝播されるようandroid:duplicateParentStateです。私が理解しているように、RefreshDrawableState はリーフに下がり、OnCreateDrawableStateandroid:duplicateParentState="true"が設定されている場合はリーフから上がりますが、完全な分析は行っていませんが、ドキュメントへの適切なポインタに興味があります。

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 チェック可能なリスト項目

于 2013-09-07T19:51:40.523 に答える