4

少し複雑なレイアウトがあり、このビューの SwitchLayout にタグを追加します。

このビュー内に ImageButton があります。このボタンへの小さなマップは次のとおりです。

LinearLayout -> SwitchLayout -> RelativeLayout -> RelativeLayout -> ImageButton

ある時点で、SwitchLayout にアタッチされたタグを取得したいのですが、ImageButton への参照しかありません。

IDで検索してみましたが、androidは下方向しか検索していないようですので、

imageButton.findViewById(R.id.switchLayout);

動作しません。

また、割り当てられたタグを ImageButton から直接取得できないようです。

このコード:

imageButton.getTag()

戻り値null

私が見つけた唯一の回避策はここにありますが、それは醜いです:

ViewSwitcher viewSwitcher = (ViewSwitcher)imageButton.getParent().getParent().getParent();
viewSwitcher.getTag();

結合はできるだけ週にしたいので、タグをviewSwitcherとそのすべての子に割り当てる方法があるかどうか疑問に思っています、

または、親ビューの中から ViewById を見つけます。

4

5 に答える 5

18

スイッチ レイアウトのリファレンスを保持しないのはなぜですか。

// In activity
switchLayout = findViewById(R.id.switchLayout);
imageButton = findViewById(R.id.imageButton);

メソッドがまだアクティビティ内にある場合は、switchLayout に直接アクセスできます。そうでない場合は、switchLayout を imageButton タグに設定して、後で読み取ることができます。

imageButton.setTag(switchLayout);

または、本当にこれを行う必要がある場合は、再帰的に行うことができます。

public ViewParent findParentRecursively(View view, int targetId) {
    if (view.getId() == targetId) {
        return (ViewParent)view;
    }
    View parent = (View) view.getParent();
    if (parent == null) {
        return null;
    }
    return findParentRecursively(parent, targetId);
}
于 2013-01-07T06:49:50.023 に答える
1

swtichlayoutへの参照を宣言および定義し、タグを直接取得します。imagebuttonを使用してswitchlayoutのタグを取得するのはなぜですか。

于 2013-01-07T06:29:40.763 に答える
1

アプリでこの Kotlin コードを使用します。

import android.view.View
import androidx.annotation.IdRes

fun <T : View> View.findParentViewById(@IdRes viewId: Int): T? {
    @Suppress("UNCHECKED_CAST")
    return when (this.id) {
        viewId -> this as? T
        else -> (parent as? View)?.findParentViewById<T>(viewId)
    }
}
于 2020-10-25T08:17:23.727 に答える
0

android のすべてのビュー (コントロール) は typeであるため、id を見つけるためにView使用できます。getId()次のスニペットを使用できます

int parentId = ((View) arg0.getParent()).getId();
于 2013-01-07T06:21:20.087 に答える