4

我有一个有点复杂的布局,我在这个视图的 SwitchLayout 中添加了一个标签。

此视图中有一个 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);

如果你的方法还在activity中,可以直接访问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 的View,所以你可以使用它getId()来查找 id。您可以使用以下代码段

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

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

fun View.findParentById(@IdRes id: Int): ViewGroup? {
    if (this.id == id) return this as? ViewGroup
    return (parent as? View)?.findParentById(id)
}
于 2020-04-22T18:15:34.180 回答