2013-03-13 13 views
13

W mojej aplikacji zmieniam tytuł w pasku akcji z każdego wyświetlanego fragmentu. Kiedy po raz pierwszy uruchamiam swoje aplikacje, mam listę żądań, więc mój tytuł to "Moje prośby (20)".Dlaczego Android obcina mój tytuł ActionBar?

Następnie, po kliknięciu elementu na tej liście, zastępuje on fragment w mojej aktywności i ustawia go na "Akcja".

Kiedy wracam do pierwszego widoku (zawsze w tej samej czynności), resetuję tytuł do "Moje żądania (20)", ale Android decyduje się je skrócić. Rezultatem jest "Moja prośba ...".

Po wielu testach wygląda na to, że Android zmniejsza mój tytuł, gdy umieszczam w nim mniejszy tekst. Ale nie powiększa go, gdy umieszczam dłuższy tekst, nawet jeśli jest dużo miejsca.

Co mogę zrobić, aby rozwiązać ten problem? Chciałbym lepsze rozwiązanie niż dodawanie spacji na końcu moich krótkich tytułów :)

Oto kod używam zmienić tytuł ActionBar:

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

Odpowiedz

2

Rozwiązałem ten problem, używając niestandardowego tytułu, zgodnie z opisem in this post.

Jest to kod używam na zmianę tytułu, gdy zakładka zmienia

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

Zauważ, że to rozwiązanie umieszcza tytuł na prawo od kart w trybie poziomym podczas korzystania actionbar kart.

+0

Dziękujemy! To rozwiązanie jest proste i czyste, lubię to! – NLemay

1

nie sądzę jest wiele ty może z tym zrobić. Wydaje się, że tytuł paska akcji ma dość ograniczoną szerokość, a cokolwiek ponad to zostanie obcięte.

Sądzę, że w jedną stronę można wyświetlić: "Moje pytania (20)", a nie "Moje prośby (20)", ale doceniam to, że nie jest to idealne rozwiązanie.

+1

Witam! Dziękuję za odpowiedź! To jest bardzo cenione! Tylko pytanie: czy jest to coś, z czym już się zetknąłeś? Czy jest to normalne zachowanie ActionBar? Czy robię coś złego? – NLemay

+1

Cześć. To jest coś, co już napotkałem. Jestem QA dla dużej globalnej gazety i nasi debiutanci z Androidem powiedzieli również, że to normalne ... Tak więc boję się, że wygląda to inaczej ... Z wyjątkiem moich sugestii lub może używając obrazu. Chociaż biorąc pod uwagę twoje wymagania to zwiększanie liczb całkowitych, które prawdopodobnie nie byłyby wystarczające. –

+1

Cóż, to także mój wniosek po kilku godzinach w sprawie tego problemu. To dziwne, ponieważ czasami tytuł jest obcięty, czasami nie. Ale nie znalazłem łatwego sposobu na rozwiązanie tego ... – NLemay

5

Wiem, że to pytanie zostało opublikowane dawno temu, ale ostatnio wpadłem na ten problem i spowodowało piekło. Pracuję nad Galaxy Note 10.1, a mój tytuł brzmiał "BidItems", a widziałem tylko element przepełnienia akcji, ale czasami "BidItems" stało się "BidIt ...", co jest po prostu śmieszne. Po wielu testach okazało się, że powodem tego obcinania w mojej aplikacji jest to, że wywoływałam metodę przy użyciu metody ((MyActivity) getApplication()).setTitle(); z jednego z moich fragmentów. Metoda setTitle() w mojej aktywności nazywa się getActionBar().setTitle(). Jak tylko nazwałem tę metodę, mój tytuł został skrócony bez powodu. Ale po prostu zadzwoń setTitle() z mojej działalności działało dobrze.

Mam nadzieję, że to uratuje ludzi od bólu głowy, który mi spowodował.

+0

Dzięki! To wygląda na dobrą poprawkę! – NLemay

+0

Witam, czy możesz wyjaśnić to bardziej wyraźnie, proszę? – Poutrathor

+0

Mam również problemy z setTitle(). Próbuję zmienić tytuł z interfejsu fragmentów wiz na Aktywność. Ale nie można tego zrobić bez zmiany długości tekstu, a tu jest zmiana: problem pojawia się tylko przy pierwszym uruchomieniu. Uruchomiłem asynctask przy pierwszym uruchomieniu. Może to coś podnieca. Brak pomysłu. – Karl

1

dodam, że można całkowicie używania tytułu bar działanie na 2 linie, aby uzyskać więcej miejsca:

//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); 
    } 

Używam go na mojej aplikacji i jestem z niego zadowolony :)

Uznanie dla tego post

1

Twój AndroidManifest.xml ma swoją definicję aktywności Podobnie jak

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

Jeżeli zmienisz android:label="Whatever" do android:label=" ",

To będzie działać. Zakładam, że tak się dzieje, ponieważ Android tworzy TextView do wyświetlania etykiety, a szerokość nie jest zmieniana po wywołaniu setTitle. Tak więc, ustawiając początkowy tytuł tak, aby miał więcej znaków niż przy ustawieniu tytułu, nie zostanie obcięty.

4

Domyślam się, że ten problem został rozwiązany przez odświeżanie interfejsu paska zadań.

Rozwiązałem poniższe kody.

ActionBar actionBar = getActivity().getActionBar(); 
actionBar.setTitle(title); 

// for refreshing UI 
actionBar.setDisplayHomeAsUpEnabled(false); 
actionBar.setDisplayHomeAsUpEnabled(true); 
+1

Po wielu cierpieniach, twoje rozwiązanie było dobrym tropem, ale nie działało dla mnie, ponieważ nie zawsze chciałbym pokazać (lub ukryć) przycisk Wstecz. Znalazłem prostszy sposób na odświeżenie interfejsu: 'actionBar.setDisplayShowTitleEnabled (true);' W takim przypadku jest więcej szans, że zawsze chcemy pokazać tytuł :-) –

2

W moim przypadku tekst był obcięty, ale nie z wielokropkiem (...), ostatni znak zawsze wyciąć, tak:

screenshot

I okazało się, że zmiana szerokość paska narzędzi z „wrap_content” do „match_parent” rozwiązuje ten problem:

<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" /> 
2

umieścić setTitle() w onCreateOptionsMenu pomaga mi rozp e ten problem.

W swojej fragmentu dodać setHasOptionsMenu(true); w onCreateView(){}

następnie zastąpić onCreateOptionsMenu().

Przykład:

@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)); 
    } 
} 

referencyjny: How to display android actionbar title without truncation occurring

3

W moim konkretnym przypadku, Zajmuję się tworzeniem aplikacji hybrydowych z kompleksem natywnej struktury menu. Ten problem występował sporadycznie podczas wywoływania głębokiego linku z treści hybrydowej, która aktualizowałaby wybraną opcję menu i ustawiała tytuł.

Wypróbowałem kilka sugerowanych poprawek, nie mając szczęścia. Ale ustawienie niestandardowego widoku dało dziwny wynik, który dał mi poczucie, że mam do czynienia z warunkami wyścigu.

To okazało się prawdą. Okazało się, że po prostu przesłanianie funkcji setTitle aktywności i owijania wywołanie Super w postDelay runnable stałe to dla mnie:

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

używam paska narzędziowego postDelayed jako metoda wygody. Ale z pewnością możesz tu użyć programu obsługi. Mam nadzieję że to pomoże.

1

Ponieważ ListView/GridView/RecyclerView nazywa się notifyDataSetChanged() w tym samym czasie. Z jakiegoś powodu spowodowałoby to aktualizację układu, co prawdopodobnie wynika z chaosu aktualizacji układu tytułu paska akcji.

Zasadniczo można opublikowaćDelay(), aby zaktualizować tytuł, aby rozwiązać ten problem, ale nie podoba mi się ten sposób.

Podejmuję decyzję o ręcznym zastąpieniu widoku obiektu BaseAdapter.notifyDateSetChanged() i elementu aktualizacji. Działa:

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; 
    } 
} 

Przepraszamy za mój zły angielski.