スピナーは、アダプターで指定された最長のアイテムに合わせてサイズ設定されているようです。これはほとんどの場合に適した動作ですが、私の特定のケースでは望ましくありません。
これをオフにすることは可能ですか?ソースの Spinner.onMeasure() を見て、私の推測ではノーですが、私は尋ねたいと思いました。
スピナーは、アダプターで指定された最長のアイテムに合わせてサイズ設定されているようです。これはほとんどの場合に適した動作ですが、私の特定のケースでは望ましくありません。
これをオフにすることは可能ですか?ソースの Spinner.onMeasure() を見て、私の推測ではノーですが、私は尋ねたいと思いました。
Spinner をサブクラス化することで、これを実現しました。
public class SpinnerWrapContent extends IcsSpinner {
private boolean inOnMeasure;
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
inOnMeasure = true;
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
inOnMeasure = false;
}
public boolean isInOnMeasure() {
return inOnMeasure;
}
}
次に、SpinnerAdapter の getView() で、onMeasure() から呼び出された場合に、現在選択されている位置を使用しました。
public View getView(int position, View convertView, ViewGroup parent) {
View view;
if (convertView != null)
view = convertView;
else {
int fixedPosition = (spinner.isInOnMeasure() ? spinner.getSelectedItemPosition() : position);
// Here create view for fixedPosition
}
return view;
}
これは私にとってはうまくいきました。重要な部分はこれです。以下の上記のコードをアダプターに配置し、selectedItemPosition を使用してオブジェクト配列からテキストを選択します。
int selectedItemPosition = position;
if (parent instanceof AdapterView) {
selectedItemPosition = ((AdapterView) parent)
.getSelectedItemPosition();
}
以下に例を示します。
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = getLayoutInflater();
final View spinnerCell;
if (convertView == null) {
// if it's not recycled, inflate it from layout
spinnerCell = inflater.inflate(R.layout.layout_spinner_cell, parent, false);
} else {
spinnerCell = convertView;
}
int selectedItemPosition = position;
if (parent instanceof AdapterView) {
selectedItemPosition = ((AdapterView) parent)
.getSelectedItemPosition();
}
TextView title = (TextView) spinnerCell.findViewById(R.id.spinnerTitle);
title.setText(titles[selectedItemPosition]);
return spinnerCell;
}
説明が必要な場合は、次のリンクに従ってください: http://coding-thoughts.blogspot.in/2013/11/help-my-spinner-is-too-wide.html
スピナーを短くしたいだけなら、簡単に修正できます。
通常、ビューに重みを与えるか、layout_width と layout_height を設定することで、ビューの高さと幅を変更できます。
<Spinner
android:id="@+id/shortenedSpinner"
android:layout_width="100dp"
android:layout_height="50dp" />
これにより、スピナーが強制的に短くなります
ドロップダウン ビューを短くしたい場合、それは異なります。この場合、スピナー アダプターの getDropDownView() メソッドで、上記と同じ変更を加えたカスタム行を提供できると思います。