按ID查找父视图

时间:2013-01-07 06:16:48

标签: java android

我有一个复杂的布局,我在这个视图的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及其所有子节点,

在父视图中查找FindViewById。

4 个答案:

答案 0 :(得分:1)

声明并定义对swtichlayout的引用并直接获取标记。为什么你想使用imagebutton获取switchlayout的标签。

答案 1 :(得分:0)

android中的所有视图(控件)都是View类型,因此您可以使用getId()来查找ID。 您可以使用以下代码段

int parentId = ((View) arg0.getParent()).getId();

答案 2 :(得分:0)

Kotlin扩展功能版本的接受答案:

fun View.findParentById(@IdRes id: Int): ViewGroup? {
    if (this.id == id) return this as? ViewGroup
    return (parent as? View)?.findParentById(id)
}

答案 3 :(得分:0)

我在应用程序中使用以下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)
    }
}