Ширина навигации в списке действий - оберните содержимое

По умолчанию в списке параметров панели навигации ширина выбранного элемента является такой же широкой, как и самый широкий элемент. Я хотел бы "wrap_content" в выбранном элементе, так как он в Google +, Gmail, картах и ​​приложениях для Android.

Кто-нибудь знает, как это сделать?

Я попытался переопределить getView навигационного адаптера, но он не работает. Похоже, что это представление обернуто другим представлением, которое имеет ширину самого широкого элемента. Я также попробовал actionbar.setCustom view с spinner, но поведение spinner было таким же. Он использует самую широкую ширину элемента.

Спасибо за все предложения, ссылки и помощь.

Current state

Required state

Ответ 1

Я столкнулся с той же проблемой. Кажется, Android вызовет метод getView() для всех элементов и, наконец, установит ширину в ширину самого широкого элемента.

Итак, мое решение:

  • Сохраните текущий выбранный раздел (например, раздел в вашем примере), скажем, selectedSection в вашем коде. На самом деле вам нужно сделать это в методе onNavigationItemSelected() для NavigationListener.

  • Переопределите метод getView() вашего SpinnerAdapter, всегда устанавливайте его в contentSection.

  • В методе onNavigationItemSelected() для NavigationListener попробуйте вызвать метод notifyDataSetChanged() вашего spinnerAdapter после того, как вы установите текущий режим на selectedSection.

Здесь пример кода:

final int selectedSection = 0;
final String sectionLabels[] = {"short sec", "long section", "looooonger section"};

final ArrayAdapter<String> arrayAdapter =
  new arrayAdapter<String>(this, simple_list_item_1) {
    @Override
    public int getCount() {
      // You need to implement here.
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
      if (convertView == null) {
        convertView = LayoutInflater.from(getContext()).inflate(R.layout.you_entry, null);
      }
      TextView textView = (TextView) convertView.findViewById(R.id.you_text);
      // Set the text to the current section.
      textView.setText(sectionLabels[selectedSection]);
    }

    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
      // You need to implement here.
    }

  }

actionBar.setListNavigationCallbacks(navigationAdpater,
  new ActionBar.OnNavigationListener() {

    @Override
    public boolean onNavigationItemSelected(int itemPosition, long itemId) {
      // Store the current section.
      selectedSection = itemPosition;
      navigationAdpater.notifyDataSetChanged();
      return true;
    }
  });

Ответ 2

Вам необходимо переопределить метод getView() в вашем адаптере и установить параметры макета в текстовое окно для обертывания содержимого. Счетчик автоматически изменит размер для выбранного элемента.

Я создал настраиваемый адаптер, простирающийся от ArrayAdapter:

public class CustomAdapter extends ArrayAdapter<String> {

После этого я переопределяю метод getView(), изменяя LayoutParams текущего представления:

@Override 
public View getView(final int position, final View convertView, final ViewGroup parent) {
            View view = convertView;
            if (null == view) {
                view = LayoutInflater.from(this.getContext())
                         .inflate(android.R.layout.simple_list_item1, null);
                ((TextView) view).setText(getItem(position));
            }
            final LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT,
                                               LayoutParams.WRAP_CONTENT);
            view.setLayoutParams(params);
            return view;
}

В своей деятельности создайте экземпляр адаптера и установите для него счетчик:

List<String> stringList = new ArrayList<String>();
stringList.add("test1");
stringList.add("test12");
stringList.add("test123");
stringList.add("test1234");

final SpinnerAdapter adapter = new CustomAdapter(this.getContext(),
                                                 android.R.layout.simple_list_item1,
                                                 android.R.id.text1, 
                                                 stringList);
mySpinner.setAdapter(adapter);

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

Ответ 3

Создайте счетчик и добавьте в него текстовые поля. На счетчике установите поле maxWidth для любого значения, которое вы хотите, и которое будет обрабатывать это. Другим вариантом было бы установить

android:layout_width="0"
android_layout_weight="0.3"

Это означало бы, что счетчик будет занимать только 1/3 ширины скрипта.

В текстовом представлении вы должны установить:

android:singleLine="false"
android:ellipsize="end"

Ответ 4

Это сработало для меня. Важная часть этого. Поместите приведенный ниже код в свой адаптер и используйте 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 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