0

プログレス サークルの幅と高さを、その隣にあるボタンの高さに設定したいと考えています。最後に、検索ボタンの高さ全体を占める高さと幅が等しい円が必要です。それを行う簡単な方法があれば教えてください。

これは単純な XML を使用して行うことはできないと思うので、アクティビティの関数でLayoutParamsこれを使用しようとしています。OnCreate()

LayoutParams lpe = search.getLayoutParams();
LayoutParams lpp = searchProgress.getLayoutParams();
lpp.width = lpe.height;
lpp.height = lpp.width;
Toast.makeText(getBaseContext(),"Width: "+lpp.width,Toast.LENGTH_LONG).show();
Toast.makeText(getBaseContext(),"Height: "+lpp.height,Toast.LENGTH_LONG).show();
searchProgress.setLayoutParams(lpp);

これは幅では機能しませんが、高さでは機能します。トーストを追加して、デバッグ情報を確認しました。lpp.widthとの両方lpp.heightです-2。どういう意味ですか?XML は次のとおりです。

<Button
    android:id="@+id/searchButton"
    style="?android:attr/buttonStyleSmall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/searchProgress"
    android:layout_alignTop="@+id/searchProgress"
    android:layout_toLeftOf="@+id/searchProgress"
    android:text="@string/searchButton" />

<ProgressBar
    android:id="@+id/searchProgress"
    style="?android:attr/progressBarStyleSmall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/searchBar"
    android:layout_alignRight="@+id/searchResult"
    android:layout_alignTop="@+id/searchBar"
    android:indeterminate="true"
    android:indeterminateBehavior="repeat" />

この -2手段によるとwrap_content。しかし、私は高さを XML のままにしたくありません。自分で確認できます。デバイスによって計算された高さが必要です。

どうすればこれを機能させることができますか?

4

2 に答える 2

0

これを試すことができます

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    final Button searchButton = (Button) findViewById(R.id.searchButton);
    final ProgressBar searchProgress = (ProgressBar) findViewById(R.id.searchProgress);

    ViewTreeObserver vto = searchButton.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            searchProgress.setLayoutParams(new LinearLayout.LayoutParams(searchButton.getMeasuredWidth(), searchButton.getMeasuredHeight()));
        }
    });
}

ボタンのサイズがプログレスバーのサイズに依存する場合、これは高速で汚いソリューションであり、パフォーマンスの問題を引き起こす場合があります (循環依存が作成され、無限ループが発生する可能性があります)。

より実用的で正しい解決策は、プログレスバーとボタンで構成されるカスタム ビューを作成することです。このビューで onMeasure をオーバーライドすると、そのパーツのサイズを明示的に制御できます。

于 2013-05-14T07:54:54.440 に答える