检查视图元素是否以编程方式添加到布局中

问题描述 投票:29回答:7

在我的fragment类中,我有条件地以编程方式将子视图元素添加到我的布局中:

LinearLayout child = (LinearLayout) inflater.inflate(R.layout.child_view, null);

LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT,100);

container.addView(child, params);

由于上面的代码将有条件地运行,所以,在某些时候,我想检查子视图是否已添加,如何以编程方式进行此检查?

android performance android-layout android-intent android-emulator
7个回答
24
投票

我想你可以简单地使用

findViewById(your_view_id) 

method:如果结果为null,则视图不存在,否则视图存在


41
投票

如果您通过inflater创建视图,则可以检查其父级

if(view.getParent() != null) {...}

23
投票

很抱歉迟到的回复,但您可以尝试这个替代方案:

在添加视图之前和添加视图之后使用container.getChildCount();。喜欢 :

int x = container.getChildCount();

container.addView(child, params);

int y = container.getChildCount();

if(y > x)
   Toast.makeText(context, "View Successfully Added!", Toas.LENGTH_SHORT).show();

9
投票

或者,如果您要查找视图实例,则可以:

if (container.indexOfChild(childView) == -1) {
  // Add child to container.
}

5
投票

我不能写评论所以我在这里写它作为一个解决方案:从API级别19你可以调用isAttachedToWindow(),它没有多大帮助,但如果你的目标是API 19或更高,那么这应该由文档工作。


0
投票

也许你可以试试这个

child.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            child.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            // add to parent
        }
    });

或者这个

child.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
        @Override
        public void onViewAttachedToWindow(View v) {

        }

        @Override
        public void onViewDetachedFromWindow(View v) {

        }
    });

0
投票

使用AndroidX,您可以使用ViewGroup.contains(view: View): Boolean扩展功能。

© www.soinside.com 2019 - 2024. All rights reserved.