web-dev-qa-db-ja.com

ビュー要素がレイアウトに追加されているか、プログラムで追加されていないかを確認します

フラグメントクラスでは、条件付きでレイアウトに子ビュー要素をプログラムで追加します。

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

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

container.addView(child, params);

上記のコードは条件付きで実行されるため、ある時点で子ビューが追加されたかどうかを確認したい、プログラムでこの確認を行う方法は?

30
Mellon

単純に使用できると思います

findViewById(your_view_id) 

method:結果がnullの場合、ビューは存在しません。それ以外の場合、ビューは存在します

24
Apperside

インフレータ経由でビューを作成する場合、彼の親を確認できます

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

返信が遅れて申し訳ありませんが、この代替手段を試すことができます:

ビューを追加する前と後に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();
23
imthegiga

または、検索するviewインスタンスがある場合:

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

私はコメントを書くことができないので、解決策としてここに書きます:APIレベル19からisAttachedToWindow()を呼び出すことができますが、あまり役に立たないのですが、_API 19以上の場合、これはドキュメントで機能するはずです。

5
ktamas

AndroidXを使用すると、ViewGroup.contains(view: View): Boolean拡張関数を使用できます。

1
int_32

たぶんあなたはこれを試すことができます

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
kewei xia