6

Custom view from resource:

// Set up the action bar.
final ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
actionBar.setCustomView(R.layout.custom_action_bar);
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);

the result is:
enter image description here

Custom view manually inflated:

// Set up the action bar.
final ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
LayoutInflater inflater = (LayoutInflater) this .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.custom_action_bar, null);
actionBar.setCustomView(view);
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);

the result is:
enter image description here

custom_action_bar.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="match_parent"
    android:orientation="horizontal" 
    android:weightSum="3">

    <TextView 
        android:id="@+id/bar_title1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:textColor="@color/White"
        android:text="title1"/>
    <TextView 
        android:id="@+id/bar_title2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:textColor="@color/White"
        android:text="title2"/>
    <TextView 
        android:id="@+id/bar_title3"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:textColor="@color/White"
        android:text="title3"/>

</LinearLayout>

The first layout shown here is the correct one, because it has weights on its widgets. The second attempt should produce the same result, but it does not.

ilomambo
  • 8,290
  • 12
  • 57
  • 106
  • 1
    can you change in custom_action_bar.xml i have chnaged android:layout_width = fill_parent and removed android:weightSum=3 Can you share the result if it works for you ? – Roll no1 Jul 08 '13 at 08:25
  • @Rollno1 I tried it. Your solution works, the `fill_parent` part is not needed (`fill_parent` is equivalent to `match_parent`). Removing the `weightsum` attribute does the trick. – ilomambo Jul 08 '13 at 08:30

2 Answers2

13

Actually, the issue here is that in second case ActionBar needs additonal layout parameters:

    final ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
    LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = inflater.inflate(R.layout.custom_action_bar, null);
    actionBar.setCustomView(view, new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
    actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);

So, it covers all ActionBar area. Looks like by default WRAP_CONTENT llayout parameters get applied to custom view.

sandrstar
  • 12,503
  • 8
  • 58
  • 65
  • Interesting. I tried your code and you are right. Even though the custom layout has `match_parent` already defined for width and height. – ilomambo Jul 08 '13 at 08:24
  • Right, but in order to be applied parent ViewGroup should be passed to inflate(). Actually, ActionBarImpl uses internal ViewGroup during inflation in method setCustomView(int resId) - e.g. setCustomView(LayoutInflater.from(getThemedContext()).inflate(resId, mActionView, false)); – sandrstar Jul 08 '13 at 08:39
  • I was getting absolutely crazy to match all the space with my custon action bar. Finally I did it adding the LayoutParams as sandrstar said. – rolgalan Nov 18 '14 at 11:40
9

Another options is to let the ActionBar do the work for you (in this case I'm showing how to do it with the support version).

// Set your custom view
getSupportActionBar().setCustomView(R.layout.custom_action_bar);

// Get the inflated view
View view = getSupportActionBar().getCustomView();

// Do what you want with the view (set the title, custom font etc.)
TextView actionBarTitle = (TextView) view.findViewById(R.id.action_bar_title);
...

// set the custom flag
getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM)
petrocket
  • 1,458
  • 2
  • 14
  • 17
  • 3
    Smart move Mr.! IMHO this should be the accepted answer. Using Layout Inflater with a 'null' as the root view is the 'root of all evil' for many layout problems as layout_* params that are parent related are ignored upon inflation. – Maciej Pigulski Jul 08 '14 at 09:35
  • Great answer! Solved my layout problem immediately. – Matthias Robbers Oct 18 '14 at 16:30
  • @MaciejPigulski 'null' in root is not root-cause, root-cause is in missed understanding of why 'root' is needed in the first place, Only way to fix it - RTFM. – sandrstar Jan 31 '15 at 10:54
  • @sandrstar, thanks for your valuable insight, especially for the RTFM part, so helpful! – Maciej Pigulski Feb 02 '15 at 12:01