studio - ¿Por qué Android está truncando mi título de ActionBar?
personalizar toolbar android studio (11)
No creo que haya mucho que puedas hacer al respecto. Parece ser que el título de la barra de acciones tiene un ancho bastante limitado y todo lo demás se trunca.
Supongo que una forma de hacerlo sería mostrar: "Mis preguntas (20)" en lugar de "Mis solicitudes (20)" pero aprecio que no es lo ideal.
En mi aplicación, cambio el título en la barra de acciones de cada fragmento que se muestra. Cuando comienzo mis aplicaciones, recibí una lista de solicitudes, por lo que mi título es "Mis solicitudes (20)".
Luego, cuando haces clic en un elemento de esa lista, está reemplazando un fragmento en mi Actividad y establece el título en "Acción".
Cuando regreso a la primera vista (siempre en la misma Actividad), restablezco el título a "Mis solicitudes (20)", pero Android decide truncarlo. Entonces el resultado es "Mi pedido ...".
Después de muchas pruebas, parece que Android está reduciendo mi título cuando pongo un texto más pequeño en él. Pero no se amplía cuando pongo un texto más largo, incluso si hay mucho espacio.
¿Qué puedo hacer para resolver esto? Me gustaría una solución mejor que agregar espacios al final de mis títulos cortos :)
Aquí está el código que uso para cambiar el título de la barra de acciones:
getActivity().getActionBar().setTitle(title);
Sé que esta pregunta fue publicada hace mucho tiempo, pero recientemente me encontré con este problema y me causó un gran dolor de cabeza. Estoy trabajando en un Galaxy Note 10.1 y mi título era "BidItems" y solo tenía el elemento de desbordamiento de acción visible, aunque a veces, "BidItems" se convirtió en "BidIt ...", lo cual es simplemente ridículo. Después de muchas pruebas, encontré que el motivo de este comportamiento truncado en mi aplicación es que estaba llamando a un método usando ((MyActivity) getApplication()).setTitle();
método de uno de mis fragmentos. El método setTitle()
en mi actividad llama a getActionBar().setTitle()
. Tan pronto como llamé a este método, mi título fue truncado sin ningún motivo. Pero simplemente llamar a setTitle()
desde mi actividad funcionó bien.
Realmente espero que esto le ahorre a la gente el dolor de cabeza que me causó.
Su AndroidManifest.xml tiene su definición de actividad como tal
<activity
android:name="com.example.DetailsView"
android:label="Details">
</activity>
Si cambias android:label="Whatever"
to android:label=" "
,
Funcionará Supongo que esto sucede porque Android crea un TextView para mostrar la etiqueta y el ancho no se cambia de tamaño cuando se llama a setTitle. Por lo tanto, al configurar el título inicial para que tenga más caracteres de los que va a establecer el título, no se truncarán.
Supongo que este problema se resuelve refrescando la interfaz de usuario de la barra de acciones.
Así que lo resolví con los códigos a continuación.
ActionBar actionBar = getActivity().getActionBar();
actionBar.setTitle(title);
// for refreshing UI
actionBar.setDisplayHomeAsUpEnabled(false);
actionBar.setDisplayHomeAsUpEnabled(true);
En mi caso, el texto estaba siendo truncado, pero no con puntos suspensivos (...), el último personaje siempre fue cortado, así:
Descubrí que cambiar el ancho de la barra de herramientas de "wrap_content" a "match_parent" resuelve el problema:
<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" />
En mi caso particular, estoy desarrollando una aplicación híbrida con una estructura de menú nativa compleja. Vería este problema de forma intermitente al llamar a un enlace profundo desde el contenido híbrido que actualizaría la opción de menú seleccionada y establecería el título.
Intenté varias de las soluciones sugeridas sin suerte. Pero establecer una vista personalizada produjo un resultado extraño que me dio la sensación de que estaba lidiando con una condición de carrera.
Esto resultó ser cierto. Descubrí que simplemente anulando la función setTitle de la actividad y ajustando la llamada a super en un runnable postDelay, solucioné esto por mí:
@Override
public void setTitle(final CharSequence title) {
toolBar.postDelayed(new Runnable() {
@Override
public void run() {
MainActivity.super.setTitle(title);
}
}, 200);
}
Estoy utilizando postDelayed de la barra de herramientas como un método de conveniencia. Pero ciertamente puedes usar un controlador aquí. Espero que esto ayude.
Añadiré que puedes usar totalmente el título de la barra de acción en 2 líneas para obtener más espacio:
//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);
}
Lo estoy usando en mi aplicación y estoy contento con eso :)
Crédito a esta publicación
Debería encontrar que la pregunta que he publicado aquí es el problema de me gusta y también he publicado la solución.
¿Por qué mi ActionBar de Android no se actualiza cuando se cambia explícitamente?
Resolví este problema usando un título personalizado como se describe en esta publicación .
Este es el código que uso para cambiar el título cuando cambia una pestaña
((TextView) actionBar.getCustomView().findViewById(R.id.title)).setText(someTitle);
Tenga en cuenta que esta solución coloca el título a la derecha de las pestañas en modo horizontal cuando usa pestañas de la barra de acciones.
poner setTitle()
en onCreateOptionsMenu
me ayuda a resolver este problema.
En su fragmento, agregue setHasOptionsMenu(true);
en onCreateView(){}
A continuación, anule onCreateOptionsMenu()
.
Ejemplo:
@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));
}
}
Referencia: Cómo mostrar el título de la barra de acciones de Android sin que se produzca el truncamiento
Porque ListView / GridView / RecyclerView se llama notifyDataSetChanged () al mismo tiempo. Por alguna razón, esto causaría la actualización del diseño, lo que supongo resultaría en el caos de la actualización del diseño del título de la barra de acciones.
Básicamente, puede postDelay () actualizar el título para solucionar este problema, pero no me gusta de esta manera.
Decidí anular a mano el BaseAdapter.notifyDateSetChanged () y actualizar la vista del elemento. Funciona:
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;
}
}
Perdón por mi mal ingles.