Ширина навигации в списке действий - оберните содержимое
По умолчанию в списке параметров панели навигации ширина выбранного элемента является такой же широкой, как и самый широкий элемент. Я хотел бы "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