3

このxmlレイアウトを見てください。

    <LinearLayout android:id="@+id/dataTableContainer"
                  android:orientation="vertical"
                  android:layout_width="fill_parent"
                  android:layout_height="wrap_content"
                  android:clipChildren="true">

        <LinearLayout android:id="@+id/dataTable"
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
                   android:orientation="vertical"/>  

    </LinearLayout>

実行時に、「dataTable」要素には、「dataTableContainer」が表示できる幅よりも広い子が入力されます。ただし、Eclipseで2つの要素のmMeasuredWidth(またはgetWidth()の戻り値)を調べると、まったく同じであることがわかります。これは当てはまらないはずです。私の理解では、「dataTable」の子は、「wrap_content」設定を指定して、独自の幅を想定するようにプッシュする必要があります。逆に、「dataTableContainer」は、画面サイズによって制約される「fill_parent」設定を考えると、それよりも小さくする必要があります。

また、「clipChildren」をfalseに設定してみました。これは、幅がコンテナーによってクリップされた場合に備えて、結果は同じままです。テーブルとコンテナーの両方の幅が同じです。

誰かが何が起こっているのか説明できますか?

コンテキストを説明するために、私がやろうとしているのは、これらの要素のサイズを収集して、「dataTable」要素のどれだけがコンテナーの外側にあり、したがって見えないかを判断することです。これは、ユーザーがテーブル要素をドラッグできる距離を制限するために必要です。ScrollView要素はモーションをネイティブに制限しますが、LinearLayoutを使用しているため、その制限機能を複製する必要があります。

4

1 に答える 1

2

私は Eclipse を信頼しすぎていたようです。アプリの状態と多くの使用可能な変数の値を検査するためにブレークポイントを使用してデバッグしている間、mMeasuredWidth/mMeasuredHeight を含む eclipse によって提供される変数のリストに依存していました。これらはソース コードの変数ではないことに注意してください。Eclipse は、私のためにオブジェクトを調べて、どういうわけかそれ自体を見つけました。したがって、どういうわけか、実際に測定された幅/高さを表していると思いました。ただし、ビューをさまざまな方法で測定でき (つまり、MeasureSpec.UNSPECIFIED または MeasureSpec.EXACTLY を使用)、Eclipse が必要な測定値を認識できないという理由だけで、私の仮定は間違っていました。

したがって、コードに追加して、必要な測定をトリガーしました。

int measureSpecParams = View.MeasureSpec.getSize(View.MeasureSpec.UNSPECIFIED);
dataTableView.measure(measureSpecParams, measureSpecParams);
int measuredWidth = dataTableView.getMeasuredWidth();
int measuredHeight = dataTableView.getMeasuredHeight();

これにより、私が求めていたビューのサイズ、つまり、親ビューまたは画面によって制限された場合の「dataTable」ビューの大きさがわかりました。

于 2012-11-05T11:14:12.147 に答える