2013-08-24 13 views
38

Szukałem dużo, ale nie mogę znaleźć sposobu, Jak ustawić tytuł w centrum ActionBar zamiast wyrównany do lewej. Użyłem poniżej kod, aby ustawić tytuł w centrum:Jak wyrównać tytuł w centrum ActionBar w domyślnym temacie (Theme.Holo.Light)

ViewGroup decorView= (ViewGroup) this.getWindow().getDecorView(); 
LinearLayout root= (LinearLayout) decorView.getChildAt(0); 
FrameLayout titleContainer= (FrameLayout) root.getChildAt(0); 
TextView title= (TextView) titleContainer.getChildAt(0); 
title.setGravity(Gravity.CENTER); 

Ale daje błąd jak poniżej:

ClassCastException : com.android.internal.widget.ActionBarView can not 
be cast to android.widget.TextView. 

Każde inne rozwiązanie ..Any pomoc będzie mile widziane.

+0

Próbujesz mimmick iOS projekt na Androida? Ponieważ tak naprawdę nie powinieneś :) – REJH

Odpowiedz

111

Można utworzyć niestandardowy układ i zastosować go do paska akcji.

Aby to zrobić, wykonaj te 2 proste kroki:

  1. kod Java

    getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); 
    getSupportActionBar().setCustomView(R.layout.actionbar); 
    

Gdzie R.layout.actionbar jest następujący układ.

  1. XML

    <?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:layout_gravity="center" 
        android:orientation="vertical"> 
    
    <TextView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_gravity="center" 
        android:id="@+id/action_bar_title" 
        android:text="YOUR ACTIVITY TITLE" 
        android:textColor="#ffffff" 
        android:textSize="24sp" /> 
    </LinearLayout> 
    

To może być tak skomplikowane, jak chcesz. Wypróbuj to!

EDIT:

Aby ustawić background można użyć właściwości android:background w układzie pojemnika (LinearLayout w tym przypadku). Być może trzeba ustawić wysokość układu android:layout_height na match_parent zamiast wrap_content.

Ponadto, można również dodać LOGO/ICON do niego. Aby to zrobić, po prostu dodaj wewnątrz swojego układu obraz ImageView i ustaw orientację układu na orientację poziomą (lub po prostu użyj RelativeLayout i zarządzaj nim samodzielnie).

Aby zmienić tytuł powyżej paska akcji niestandardowej dynamicznie, to zrobić:

TextView title=(TextView)findViewById(getResources().getIdentifier("action_bar_title", "id", getPackageName())); 
title.setText("Your Text Here"); 
+0

Działa idealnie, ale używa niestandardowego wyświetlacza .. I używam Theme.Holo.Light..So Wszystkie logo z obrazem, kolorem tła i przyciskiem Back są usuwane i tylko prosty pasek tytułu koloru białego jest wyświetlany w centrum ActionBar. Czy jest jakiś sposób, aby wyświetlić go w środku bieżącego motywu? Dzięki. – Ponting

+0

Twoja druga odpowiedź nie zadziałała. Mówi, że FrameLayout nie może być rozwiązany, aby pisać. – Ponting

+0

co z pierwszym? –

7

Wydaje się nie ma sposobu, aby to zrobić bez widoku niestandardowego. Można uzyskać pogląd Tytuł:

View decor = getWindow().getDecorView(); 
TextView title = (TextView) decor.findViewById(getResources().getIdentifier("action_bar_title", "id", "android")); 

Ale zmienianie gravity lub layout_gravity nie ma wpływu. Problem w ActionBarView, którego układ jego dzieci sam w sobie, tak zmieniający paragramy jego dzieci również nie ma żadnego efektu. Aby zobaczyć ten excecute następujący kod:

ViewGroup actionBar = (ViewGroup) decor.findViewById(getResources().getIdentifier("action_bar", "id", "android")); 
View v = actionBar.getChildAt(0); 
ActionBar.LayoutParams p = new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); 
p.gravity= Gravity.CENTER; 
v.setLayoutParams(p); 
v.setBackgroundColor(Color.BLACK); 
+0

wyjątek nullpointer dla akcji Bar Apptheme jest DarkActionBar – Karoly

1

myślę umieszczając poglądów na pasku akcji dojdziesz co chcesz.Na pasku działań, gdy zestaw układów jest ustawiony tak, aby pasował do rodzica, nie pasuje do pełnej szerokości , dlatego zrobiłem to programowo tam, gdzie mi się to udało. Aby ustawić szerokość (działa tak jak layout_weight = "value"), możemy ustawić nasz widok tam, gdzie chcemy:

actionBar = getSupportActionBar(); 
    actionBar.setDisplayShowCustomEnabled(true); 

    LayoutInflater ll = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    LinearLayout linearLayout = (LinearLayout) ll.inflate(R.layout.custom_actionbar, null); 
    //inner layout within above linear layout 
    LinearLayout inner = (LinearLayout) linearLayout.findViewById(R.id.inner_linear_ractionbar); 
    inner.setMinimumWidth(getWidth() * 2/10); 
    // we will set our textview to center and display there some text 
    TextView t = (TextView) linearLayout.findViewById(R.id.center_text); 
    t.setWidth(getWidth() * 6/10); 


    Button b = (Button) linearLayout.findViewById(R.id.edit_button); 
    b.setWidth(getWidth() *3/ 20); 

    ImageButton imageButton = (ImageButton) linearLayout.findViewById(R.id.action_bar_delete_item); 
    imageButton.setMinimumWidth(deviceUtils.getWidth()/20); 

i tu jest getWidth() metoda:

public int getWidth() { 
    DisplayMetrics dm = new DisplayMetrics(); 
    mActivity.getWindowManager().getDefaultDisplay().getMetrics(dm); 
    return dm.widthPixels; 
    } 
6

Zapoznaj się nowy pasek narzędzi na klasy biblioteki wsparcie w Lollipop aktualizować można zaprojektować actionbar dodając pasek w układzie

dodać te przedmioty w y Nasza aplikacja motyw

<item name="android:windowNoTitle">true</item> 
    <item name="windowActionBar">false</item> 

Załóż pasek w układzie oraz swój TextView w centrum zaprojektować Pasek

<android.support.v7.widget.Toolbar 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/toolbar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/acbarcolor"> 
     <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 

    <TextView 
     android:id="@+id/toolbar_title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_centerVertical="true" 
     android:text="@string/app_name" 
     android:textColor="#ffffff" 
     android:textStyle="bold" /> 



    </RelativeLayout> 

</android.support.v7.widget.Toolbar> 

dodać pasek działań w pasku narzędziowym

toolbar = (Toolbar) findViewById(R.id.toolbar); 
     if (toolbar != null) { 
      setSupportActionBar(toolbar); 
      getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     } 

upewnij się, że należy dodać pasek narzędzi do pliku zasobów, takiego jak ten:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    android:orientation="vertical" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools"> 

     <include 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      layout="@layout/toolbar" /> 

    <android.support.v4.widget.DrawerLayout 

    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <!-- Framelayout to display Fragments --> 



    <FrameLayout 
     android:id="@+id/frame_container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
     <include 

      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      layout="@layout/homepageinc" /> 



     </FrameLayout> 
     <fragment 
      android:id="@+id/fragment1" 
      android:layout_gravity="start" 
      android:name="com.shouldeye.homepages.HomeFragment" 
      android:layout_width="250dp" 
      android:layout_height="match_parent" /> 
    </android.support.v4.widget.DrawerLayout> 

</LinearLayout> 
1

kod Java: napisać to w onCreate()
getSupportActionBar().setDisplayShowCustomEnabled(true); getSupportActionBar().setCustomView(R.layout.action_bar);

i dla was widoku niestandardowego, wystarczy użyć FrameLayout, wschód peasy!
android.support.v7.widget.Toolbar ma innej opcji

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="left|center_vertical" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:text="@string/app_name" 
     android:textColor="@color/black" 
     android:id="@+id/textView" /> 
</FrameLayout> 
2

To rzeczywiście działa:

getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); 
getActionBar().setCustomView(R.layout.custom_actionbar); 
    ActionBar.LayoutParams p = new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); 
     p.gravity = Gravity.CENTER; 

Trzeba zdefiniować układ custom_actionbar.xml która jest jak na swoje wymagania np :

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="50dp" 
    android:background="#2e2e2e" 
    android:orientation="vertical" 
    android:gravity="center" 
    android:layout_gravity="center"> 

    <ImageView 
     android:id="@+id/imageView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/top_banner" 
     android:layout_gravity="center" 
     /> 
</LinearLayout> 
0

Miałem ten sam problem, a z powodu przycisku "Strona główna" dodanego automatycznie na pasku narzędzi, mój tekst nie został dokładnie wprowadzony.

Naprawiłem to w brudny sposób, ale działa dobrze w moim przypadku. Po prostu dodałem margines po prawej stronie mojego TextView, aby zrekompensować przycisk Home po lewej stronie. Oto mój układ Pasek:

<android.support.v7.widget.Toolbar 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:elevation="1dp" 
    android:id="@+id/toolbar" 
    android:layout_width="match_parent" 
    android:layout_height="?attr/actionBarSize" 
    app:layout_collapseMode="pin" 
    android:gravity="center" 
    android:background="@color/mainBackgroundColor" 
    android:fitsSystemWindows="true" > 

    <com.lunabee.common.utils.LunabeeShadowTextView 
     android:id="@+id/title" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginRight="?attr/actionBarSize" 
     android:gravity="center" 
     style="@style/navigation.toolbar.title" /> 

</android.support.v7.widget.Toolbar> 
2

Wiem, że moja odpowiedź nie jest na czasie, ale jest to czysto kod nie xml wymagane.
ten jest przeznaczony do użytku w Activity

public void setTitle(String title){ 
    getSupportActionBar().setHomeButtonEnabled(true); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    TextView textView = new TextView(this); 
    textView.setText(title); 
    textView.setTextSize(20); 
    textView.setTypeface(null, Typeface.BOLD); 
    textView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); 
    textView.setGravity(Gravity.CENTER); 
    textView.setTextColor(getResources().getColor(R.color.white)); 
    getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); 
    getSupportActionBar().setCustomView(textView); 
} 


To jest do zastosowania w Fragment

public void setTitle(String title){ 
    ((AppCompatActivity)getActivity()).getSupportActionBar().setHomeButtonEnabled(true); 
    ((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    TextView textView = new TextView(getActivity()); 
    textView.setText(title); 
    textView.setTextSize(20); 
    textView.setTypeface(null, Typeface.BOLD); 
    textView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); 
    textView.setGravity(Gravity.CENTER); 
    textView.setTextColor(getResources().getColor(R.color.white)); 
    ((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); 
    ((AppCompatActivity)getActivity()).getSupportActionBar().setCustomView(textView); 
} 
+0

dobra i prosta odpowiedź dziękuję :) –

0

Można wymusić pasek tytułowy i owijając poziomu właściwej wyściółkę, która ma domyślną lewo dopełnienie dla tytułu.Niż położyć kolor tła do rodzica pasku narzędzi iw ten sposób część, która jest wycięty przez owinięcie tytuł jest w tym samym kolorze (biały w moim przykładzie):

<android.support.design.widget.AppBarLayout 
    android:id="@+id/appbar_layout" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/white"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="wrap_content" 
      android:layout_height="56dp" 
      android:layout_gravity="center_horizontal" 
      android:paddingEnd="15dp" 
      android:paddingRight="15dp" 
      android:theme="@style/ThemeOverlay.AppCompat.ActionBar" 
      app:titleTextColor="@color/black"/> 

</android.support.design.widget.AppBarLayout> 
Powiązane problemy