1

カスタムアダプタのgetViewメソッドでLinearLayout要素の幅を取得したいと思います。私のgetViewメソッドは次のようになります。

@Override
    public View getView(int position, View v, ViewGroup parent) {
        View mView = v;

        if (mView == null) {

            LayoutInflater vi = (LayoutInflater) getContext().getSystemService(
                    Context.LAYOUT_INFLATER_SERVICE);
            mView = vi.inflate(R.layout.levelselector_item, null);


        } 
if (mView != null) {
...
LinearLayout ln = (LinearLayout) mView.findViewById(R.id.lineScore);
            LinearLayout lnTotal = (LinearLayout) mView.findViewById(R.id.lineScoreTotal);
int widthTotal = lnTotal.getWidth()/2;
                ln.getLayoutParams().height = 3;
                ln.getLayoutParams().width = widthTotal;
                ln.requestLayout();
                ln.setBackgroundColor(Color.parseColor("#eef05e"));

}
        return mView;
    }

私のwidthTotalに値がないようです。グリッドビューの項目をクリックして戻るボタンを押すと、突然黄色のバーが表示されます。ln.getLayoutParams()。width=20と入力すると; 彼はまた、黄色の短いバーを示しています。いつどこでLinearLayoutの幅を取得できるかわかりません...

4

4 に答える 4

1

lineScoreビューのサイズを高さ3ピクセル、ビューの幅の半分に設定しようとしているようですlineScoreTotal。残念ながら、このようにすることはできません。getViewコードは、ビューがアクティビティのビュー階層にアタッチされる前に実行されるため、サイズは定義されていません。

1つのアプローチは、このスレッドonMeasureで提案されているように、独自のカスタムビューとオーバーライドを定義することです。これはおそらく最もクリーンな方法です。

もう1つは、parentビューのディメンションを照会することです。パディングなどを考慮します。mView次に、適切な幅と高さの測定仕様を作成し、寸法を照会する前にレイアウトします。

もう1つは、全幅を目的の比率に分割するレイアウトを作成することです。レイアウトを投稿していないので、具体的な提案はできません。たとえば、行のコンテナが垂直LinearLayoutの場合、次のようになります。

<LinearLayout
     android:orientation="vertical"
     . . . >
     . . .
    <LinearLayout
         android:orientation="horizontal"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content">

         <View
              android:layout_width="0dp"
              android:layout_height="3dp"
              android:layout_weight="25" />
         <View
              android:layout_width="0dp"
              android:layout_height="3dp"
              android:layout_weight="50"
              android:background="#eef05e" />
         <View
              android:layout_width="0dp"
              android:layout_height="3dp"
              android:layout_weight="25" />
    </LinearLayout>
    . . .
</LinearLayout>

これは特に効率的ではありませんが(3つの追加ビューを使用)、すべてをXMLで実行できます。APIレベル14以上を対象としている場合は、Spaceビューを使用して間隔を指定することもできます。

編集

parent「ビューをクエリ...」の意味を概説するコードは次のとおりです。

int availW = parent.getWidth() - parent.getPaddingLeft() - parent.getPaddingRight();
int widthSpec = MeasureSpec.makeMeasureSpec(availW, MeasureSpec.AT_MOST);
// similar for height
mView.measure(widthSpec, heightSpec);
mView.layout(0, 0, mView.getMeasuredWidth(), mView.getMeasuredHeight());
// now you can query the width of `mView`

私はこれをテストしていないので、それが機能することを保証することはできませんが、これはアイデアです。

于 2012-10-03T17:13:20.283 に答える
1

コードでディメンションを設定する代わりに、XMLで設定できます。LinearLayoutのweightプロパティを使用して、「半分」の親の幅を取得できます。例えば

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:weightSum="2" >

    <View
        android:layout_width="0dp"
        android:layout_height="3dp"
        android:layout_weight="1"
        android:background="#eef05e" />

</LinearLayout>
于 2012-10-03T17:58:22.770 に答える
0

画面にレイアウト(R.layout.levelselector_item)を設定する前に、ビューの幅を取得できるとは思いません。0を返す必要があります。

于 2012-10-03T16:57:51.903 に答える
0

正常に動作するようになりました。興味があるかもしれない人のために:

最初に、グリッドビューの周囲の境界線を、xmlでグリッドビューに追加することで制御可能な量に設定しました。

android:listSelector="@null"
android:layout_margin="5dp"

次に、Ted HoppとSameerのソリューションを組み合わせて使用​​しました。要素のパディングが何であるかを知っているので、グリッドビューの周囲で5dp、要素間で2dp、要素内で15dp。また、各行に3つのアイテムがあります。これにより、コードは次のようになります。

int parentW = parent.getWidth() - parent.getPaddingLeft() - parent.getPaddingRight();
                Resources r = C.getResources();
                float pxPaddingBetweenItem = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 2, r.getDisplayMetrics());
                float pxPaddingInItem = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 15, r.getDisplayMetrics());

                int totalBarWidth = (parentW - (int)(2*pxPaddingBetweenItem)  - (int)(6*pxPaddingInItem))/3;

そして、これは私がなりたい場所に正確に連れて行ってくれます:)ありがとう!

于 2012-10-04T13:59:35.500 に答える