5

こんにちは仲間の開発者。

Androidアプリケーションにグリッドビューがあります。グリッドビューには、列数に自動的に合わせる設定があり、最小列幅は250ピクセルです。

グリッドセル内には、画像ビューといくつかのテキストビューを持つLinearLayoutがあります。

画像ビューを常に正方形にしたいのですが、残念ながら、どのレイアウト設定でもこれを行うことができませんでした(オプションがない場合は、ここで提案を開いてください)。

したがって、私の考えは、画像の読み込みクラスでグリッド列の幅を取得し、幅に一致するようにimageViewの高さを動的に調整する必要があるということです。

しかし、列幅を取得できませんでした。にbreakPointを設定する public View getView(int position, View convertView, ViewGroup parent)と、親のViewGroupがグリッドであり、列幅の値が正しいことがわかりますが、次を使用すると次のようになります。

GridView mGridView = (GridView)parent;
int width = mGridView.getColumnWidth();

getColumnWidthメソッドがないと表示されるため、アプリがクラッシュします。

ここで何か助けはありますか?

4

3 に答える 3

6

解決策は、要件に応じてImageViewを拡張し、onMesure()メソッドをオーバーライドすることです。

onMeasure(int widthMeasureSpec, int heightMeasureSpec){
   super.onMeasure(widthMeasureSpec,heightMeasureSpec);
   setMeasuredDimension(getMeasuredWidth(),getMeasuredWidth());

}
于 2013-01-07T00:10:41.840 に答える
6

誰かが実際のcolumnWidthpreapi 16を取得する方法を探している場合に備えて(この投稿を見たときのように)、これが私がそれを取得する方法です。

GridViewを拡張し、getColumnWidthメソッドをこれでオーバーライドしました

@SuppressLint("NewApi")
@Override
public int getColumnWidth() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
        return super.getColumnWidth();
    else {
        try {
            Field field = GridView.class.getDeclaredField("mColumnWidth");
            field.setAccessible(true);
            Integer value = (Integer) field.get(this);
            field.setAccessible(false);

            return value.intValue();
        } catch (NoSuchFieldException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }
}
于 2013-11-06T15:35:46.153 に答える
1

Daniel Boの答えの代わりに、値を手動で計算することもできます。

private int getColumnWidth(Context context, GridView gridView) {
    if (android.os.Build.VERSION.SDK_INT >= 16)
        return gridView.getColumnWidth();

    Resources res = context.getResources();
    int lPad = (int)res.getDimension(R.dimen.left_padding);
    int rPad = (int)res.getDimension(R.dimen.right_padding);
    int hSpace = (int)res.getDimension(R.dimen.horizontal_spacing);
    int cols = gridView.getNumColumns();
    int width = gridView.getWidth();

    return (width - lPad - rPad + hSpace) / cols - hSpace;
}

これは11より高いAPI(Honeycomb)でのみ機能し、リソースとして定義されたいくつかの値を使用してGridViewを設定することを前提としていることに注意してください。たとえば、次のようなdimens.xmlがあるとします。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="left_padding">4dp</dimen>
    <dimen name="right_padding">8dp</dimen>
    <dimen name="horizontal_spacing">2dp</dimen>
</resources>

そして、レイアウトXMLファイルには次のものがあります。

<GridView
    ...
    android:horizontalSpacing="@dimen/horizontal_spacing"
    android:paddingLeft="@dimen/left_padding"
    android:paddingRight="@dimen/right_padding"
    ...
    />

また、同様のGridViewが多数ある場合は、これらのプロパティをカスタムスタイルに配置することをお勧めします。

少なくとも、これはリフレクションを使用せずに機能しました。この関数を頻繁に呼び出すのはおそらくやり過ぎであることに注意してください。

これが誰かを助けることを願っています。

于 2014-01-12T16:06:47.403 に答える