Почему Android урезает мой заголовок ActionBar?

В моем приложении я изменяю заголовок в ActionBar из каждого отображаемого фрагмента. Когда я впервые запускаю свои приложения, у меня есть список запросов, поэтому мой заголовок «Мои запросы (20)».

Затем, когда вы нажимаете на элемент в этом списке, он заменяет фрагмент в моей Activity и устанавливает заголовок в «Action».

Когда я вернусь к первому представлению (всегда в том же упражнении), я перезапустил заголовок в «Мои запросы (20)», но андроид решил усечь его. Таким образом, результат «Мой запрос …».

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

Что я могу сделать, чтобы решить эту проблему? Я бы хотел получить лучшее решение, чем добавлять пробелы в конце моих коротких названий 🙂

Вот код, который я использую для изменения названия ActionBar:

getActivity().getActionBar().setTitle(title); 

Solutions Collecting From Web of "Почему Android урезает мой заголовок ActionBar?"

Я решил эту проблему, используя пользовательский заголовок, как описано в этом сообщении .

Это код, который я использую для изменения названия при изменении вкладки

 ((TextView) actionBar.getCustomView().findViewById(R.id.title)).setText(someTitle); 

Обратите внимание, что это решение помещает заголовок справа от вкладок в ландшафтном режиме при использовании вкладок в панели действий.

Я знаю, что этот вопрос был опубликован давно, но я недавно столкнулся с этой проблемой, и это вызвало ужасную головную боль. Я работаю над Galaxy Note 10.1, и мой заголовок был «BidItems», и я видел только элемент переполнения действия, но иногда «BidItems» стал «BidIt …», что просто смешно. После большого тестирования я обнаружил, что причиной этого усекающего поведения в моем приложении является то, что я вызывал метод, используя ((MyActivity) getApplication()).setTitle(); Метод из одного из моих фрагментов. Метод setTitle() в моей активности вызывает getActionBar().setTitle() . Как только я назвал этот метод, мое название было усечено без причины. Но просто вызов setTitle() из моей активности работал нормально.

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

Я думаю, эта проблема решена обновлением пользовательского интерфейса панели действий.

Поэтому я решил с помощью нижеприведенных кодов.

 ActionBar actionBar = getActivity().getActionBar(); actionBar.setTitle(title); // for refreshing UI actionBar.setDisplayHomeAsUpEnabled(false); actionBar.setDisplayHomeAsUpEnabled(true); 

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

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

Это оказалось правдой. Я обнаружил, что просто переопределение функции setTitle и завершение вызова super в postDelay runnable исправлено для меня:

 @Override public void setTitle(final CharSequence title) { toolBar.postDelayed(new Runnable() { @Override public void run() { MainActivity.super.setTitle(title); } }, 200); } 

Я использую панель инструментов postDelayed как метод удобства. Но вы можете, конечно, использовать обработчик здесь. Надеюсь это поможет.

В моем случае текст усекался, но не с эллипсисом (…), последний символ всегда был вырезан, как это:

Скриншот

Я узнал, что изменение ширины панели инструментов от «wrap_content» до «match_parent» решает проблему:

  <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:layout_weight="1" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" /> 

setTitle() в onCreateOptionsMenu помогает мне решить эту проблему.

В вашем фрагменте добавьте setHasOptionsMenu(true); В onCreateView(){}

Затем переопределите onCreateOptionsMenu() .

Пример:

 @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); // put getActivity in onCreateOptionsMenu will not return null if (getActivity() != null) { getActivity().setTitle(getResources().getString(R.string.Studies)); } } 

Ссылка: как отображать заголовок панели управления Android без усечения

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

Я предполагаю, что один из вариантов: «Мои требования (20)», а не «Мои запросы (20)», но я понимаю, что это не идеально.

Я добавлю, что вы можете полностью использовать заголовок панели действий на 2 строках, чтобы получить больше места:

 //Set the title over 2 lines if needed: int titleId = Resources.getSystem() .getIdentifier("action_bar_title", "id", "android"); if (titleId > 0) { TextView title = (TextView) findViewById(titleId); title.setSingleLine(false); title.setMaxLines(2); // title.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); } 

Я использую его в своем приложении, и я доволен им 🙂

Кредит на эту должность

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

Почему мой Android ActionBar не обновляется, когда он явно изменен

У вашего AndroidManifest.xml есть определение активности, например

 <activity android:name="com.example.DetailsView" android:label="Details"> </activity> 

Если вы измените android:label="Whatever" to android:label=" " ,

Это сработает. Я предполагаю, что это происходит, потому что андроид создает TextView для отображения метки, а ширина не изменяется при вызове setTitle. Поэтому, задав начальное название, чтобы иметь больше символов, чем вы хотите установить заголовок, он не будет усечен.

Поскольку ListView / GridView / RecyclerView называется notifyDataSetChanged () одновременно. По какой-то причине это приведет к обновлению макета, которое, как мне кажется, приводит к хаосу обновления макета заголовка панели действий.

В принципе, вы можете postDelay () обновить заголовок, чтобы исправить эту проблему, но мне это не нравится.

Я решил переопределить BaseAdapter.notifyDateSetChanged () и вручную просмотреть элемент представления. Оно работает:

 public abstract class BaseListAdapter<BEAN extends Unique, VH extends BaseListViewHolder<BEAN>> extends BaseAdapter { // data private List<BEAN> mList; // view holder private List<VH> mViewHolderList = new ArrayList<>(); protected abstract void onBindViewHolder(VH holder, int position); protected abstract VH onCreateViewHolder(ViewGroup parent, int viewType); ... @Override public View getView(int position, View convertView, ViewGroup parent) { VH viewHolder; if (convertView == null) { viewHolder = onCreateViewHolder(parent, getItemViewType(position)); convertView = viewHolder.itemView; convertView.setTag(viewHolder); mViewHolderList.add(viewHolder); } else { //noinspection unchecked viewHolder = (VH) convertView.getTag(); } viewHolder.setData(getItem(position)); viewHolder.setPosition(position); onBindViewHolder(viewHolder, position); return convertView; } @Override public void notifyDataSetChanged() { if (mViewHolderList.size() == 0) { super.notifyDataSetChanged(); } else { for (VH vh : mViewHolderList) { onBindViewHolder(vh, vh.getPosition()); } } } } public class BaseListViewHolder<T> { public View itemView; private T data; private int position; public BaseListViewHolder(View itemView) { this.itemView = itemView; } @Override public T getData() { return data; } @Override public void setData(T data) { this.data = data; } public int getPosition() { return position; } public void setPosition(int position) { this.position = position; } } 

Извините за мой плохой английский.