2014-01-29 7 views
16

У меня есть прядильщик, который в настоящее время закрывает какой-то текст под вращателем при открытии. Мне нужно ограничить максимальную выпадающую длину счетчика, либо через java-код, либо через XML, чтобы он не скрывал этот текст.Как установить максимальную длину для раскрывающегося списка счетчика?

Текущий дизайн - это левый пример, а желаемый дизайн - справа. explanation

Как я могу ограничить, как далеко падает счетчик, когда он открывается? В настоящее время он падает, чтобы заполнить всю часть экрана под ним.

+0

http://stackoverflow.com/questions/2390418/android-how-to-set-the-maximum-size-of-a-spinner – keshav

+0

Это другая ситуация кешав; Я прошу ограничить максимальную высоту, но этот вопрос касается максимальной ширины текстовых элементов внутри счетчика. – james

ответ

8

Одним из способов достижения этой цели является использование 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).

-3

Я думаю, вам нужно использовать собственный счетчик для вашего требования. Не существует встроенного метода или свойства xml, которые могут вам помочь.

См. Этот пример для справки.

https://github.com/ankitthakkar/DropDownSpinner

Надеется, что это будет работать.

Примечание: Это измененный ответ.

+0

http://stackoverflow.com/questions/9923269/modify-the-size-of-an-android-spinner-drop-down-part-size – keshav

+0

Это успешно изменяет ширину, но не настолько, насколько она падает. – james

+0

http://stackoverflow.com/questions/20238513/android-limit-the-no-of-items-displayed-in-a-spinners-dropdown-list – keshav

3

Я искал совсем немного, и кажется, что я нигде не могу найти решение. Возможно, вам придется пойти немного иначе, обновив функциональность счетчика, но используя кнопки и диалоги.

Предполагая, что вы используете ArrayAdapter для блесны, попробуйте следующее:

Замените Spinner с кнопкой, которая имеет значок со стрелкой вниз.

Создайте заказ Dialog или AlertDialog и заполните ListViewArrayAdapter. Для метода onClick нажмите значение выбранного параметра и введите переменную static и текст кнопки с выбранным значением. Таким образом вы можете сделать размер диалогового окна любым размером, который вам нужен, и избыточные варианты всегда будут прокручиваться.

Я знаю, что это не идеально, но я не нашел способа изменить высоту «выпадающего» участка спиннера.

Извините, если вы этого не ожидали.

EDIT: Кто-то еще задал тот же вопрос здесь раньше, и выясняется, что они пошли с точным методом, который я только что описал. Вы можете увидеть пример кода, который они используют здесь: Check out the question/code

0

Размер набора Spinner имеет android: layout_width = "wrap_content" определяется его содержимым. Если вы хотите, чтобы все было эллипсисом, это зависит от вас в вашем SpinnerAdapter, когда вы создаете свою строку «Представления».

Или, жесткий провод андроида: layout_width, который имеет фиксированный размер.

Или вместо использования LinearLayout используйте RelativeLayout и структурируйте свои правила таким образом, чтобы Spinner занимал оставшееся место в строке, привязывая его к левой стороне экрана и к левой части первого EditText. Хотя я не уверен на 100%, что происходит, если контент слишком велик - он, вероятно, просто усекается.

Смежные вопросы