Одним из способов достижения этой цели является использование IcsSpinner ActionBarSherlock. Я сделал необходимые изменения, чтобы ограничить размер счетчика, и это, похоже, работает хорошо.
Внесите следующие изменения в IcsListPopupWindow.
Добавить переменную экземпляра:
private int mDropDownVerticalOffsetBottom;
Добавьте метод, чтобы установить эту переменную:
public void setVerticalOffsetBottom(int offsetBottom) {
mDropDownVerticalOffsetBottom = offsetBottom;
}
Alter вызов getMaxAvailableHeight к (mDropDownVerticalOffsetBottom был добавлен):
final int maxHeight = /*mPopup.*/getMaxAvailableHeight(
mDropDownAnchorView, mDropDownVerticalOffset, mDropDownVerticalOffsetBottom, ignoreBottomDecorations);
Измените подпись метода, чтобы включить эту переменную:
private int getMaxAvailableHeight(View anchor, int yOffset, int yOffsetBottom, boolean ignoreBottomDecorations) {
И считают, что смещение при вычислении расстояния до дна:
final int distanceToBottom = bottomEdge - (anchorPos[1] + anchor.getHeight()) - yOffset - yOffsetBottom;
Теперь измените IcsSpinner.java реализовать метод установки для смещения:
private DropdownPopup mPopup; // <- needs to be a DropdownPopup instead of a SpinnerPopup
public void setVerticalOffsetBottom(int offsetBottom) {
mPopup.setVerticalOffsetBottom(offsetBottom);
}
Теперь «все» вам нужно установить смещение в правильное значение. Вот как я это сделал (я тестировал его, и он работал на двух тестовых устройств):
final View root = findViewById(R.id.root_layout);
final View view = findViewById(R.id.view_not_to_be_obscured);
root.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
public void onGlobalLayout() {
root.getViewTreeObserver().removeGlobalOnLayoutListener(this);
int[] locations = new int[2];
root.getLocationOnScreen(locations);
int y1 = locations[1];
int h1 = root.getHeight();
view.getLocationOnScreen(locations);
int y2 = locations[1];
int offset = y1 + h1 - y2;
// here we initialize the spinner
}
});
Предполагается, что root_layout заполняет целое окно, исключая все элементы декорирования.
Последним шагом является создание самого кок:
// actionDropDownStyle is an attribute set in the theme to e.g. @style/Widget.Sherlock.Spinner.DropDown.ActionBar or @style/Widget.Sherlock.Light.Spinner.DropDown.ActionBar for light theme
IcsSpinner spinner = new IcsSpinner(context, null, R.attr.actionDropDownStyle);
// yes here we set the offset!
spinner.setVerticalOffsetBottom(offset);
spinner.setPadding(spinner.getPaddingLeft(), 0, spinner.getPaddingRight(), 0);
spinner.setId(R.id.some_id);
spinner.setAdapter(yourAdapter); // you can use a simple ArrayAdapter or whatever you need
// create ICS LinearLayout
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
IcsLinearLayout linearLayout = (IcsLinearLayout) inflater.inflate(R.layout.abs__action_bar_tab_bar_view, null);
linearLayout .setPadding(listNavLayout.getPaddingLeft(), 0, listNavLayout.getPaddingRight(), 0);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
params.gravity = Gravity.CENTER;
linearLayout .addView(spinner, params);
Теперь, может показаться сложным, но, как кто-то другой говорил, вы не сможете достичь этого без вашей собственной реализации вращателя и так ActionBarSherlock приходит с одним, почему бы не использовать его? Это, безусловно, меньше работы, чем написание собственного. Если вы не используете библиотеку для панели ActionBar для удаления всех файлов ресурсов, которые вам не нужны, и используйте Proguard для удаления всех неиспользуемых классов. Возможно, вы можете достичь того же, используя AppCompat (см. Здесь: https://github.com/android/platform_frameworks_support/tree/master/v7/appcompat/src/android/support).
http://stackoverflow.com/questions/2390418/android-how-to-set-the-maximum-size-of-a-spinner – keshav
Это другая ситуация кешав; Я прошу ограничить максимальную высоту, но этот вопрос касается максимальной ширины текстовых элементов внутри счетчика. – james