3

GONEレイアウト xml に設定されている LinearLayout(A) があります。私が達成したいのは、ボタン(B)がクリックされると、LinearLayout(A)が設定されVISIBLE、その高さを取得して親レイアウトの高さを更新することです。LinearLayout(A) を可視に設定し、その高さを取得することもできましたが、親レイアウトの高さを直接更新できませんでした。私の現在のコードの問題は、別の UI イベントがトリガーされた後にのみ親レイアウトが更新されることです (スピナー ドロップダウン メニューが開かれる、ソフト キーボードが表示されるなど)。私が本当に欲しいのは、ボタン(B)がクリックされた直後に親レイアウトが更新されることです。

これが私のコードです。

@Override
public void onClick(View v) {
    if(v==buttonB) {
        ShowLinearLayoutA();
    }
}

private ViewTreeObserver vto;

private void ShowLinearLayoutA() {
    LinearLayoutA.setVisibility(View.VISIBLE);
    if (vto == null) {
        vto = LinearLayoutA.getViewTreeObserver();
        vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                ParentLayout.getLayoutParams().height=LinearLayoutA.getHeight();
                ParentLayout.invalidate();
            }
        });
    }
}

私は何を間違えましたか?

英語で失礼します。よろしくお願いします。

EDIT 1:使ってみrunOnUiThreadましたが、うまくいきません

私の編集したコード

private void ShowLinearLayoutA() {
    LinearLayoutA.setVisibility(View.VISIBLE);
    if (vto == null) {
        vto = LinearLayoutA.getViewTreeObserver();
        vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                ParentLayout.getLayoutParams().height=LinearLayoutA.getHeight();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        ParentLayout.invalidate();
                    }
                });
            }
        });
    }
}

編集2:

この方法は諦めました。代わりに、アニメーションを使用して動作させました。ありがとう :)

4

4 に答える 4

1

間違ったスレッドで UI 作業を実行しています。などの UiThread で UI 操作を実行します。

private void ShowLinearLayoutA() {
    YourActivity.this.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            LinearLayoutA.setVisibility(View.VISIBLE);
        }
    });

if (vto == null) {
    vto = LinearLayoutA.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            YourActivity.this.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    ParentLayout.getLayoutParams().height=LinearLayoutA.getHeight();
                    ParentLayout.invalidate();
                }
            });
        }
    });
}
}
于 2012-12-02T13:40:51.803 に答える
1

これは本当に古い質問であることは知っていますが、答えはないと思います。私は同じ問題に苦労しました。重要な点は、実行時に変更される前に高さを更新しようとしていることです。単純な遅延タスクが解決策になる可能性があります。

_layout.postDelayed(new Runnable() {
        @Override
        public void run() {
            _layout.setBackgroundDrawable(backgroundImage);
        }
    }, 100); // delayed for 0.1 sec
于 2015-08-04T13:34:27.327 に答える
0

電話

LinearLayoutA.invalidate()
于 2012-12-02T13:34:37.470 に答える
0

この方法は諦めました。代わりに、アニメーションを使用して動作させました。ありがとう :)

于 2012-12-19T15:55:15.143 に答える