如何在ActionBar中显示自定义视图?

我想在操作栏中显示自定义search(我正在使用ActionBarSherlock)。

我明白了:

在这里输入图像说明

但是我想让自定义布局(edittext字段)占据整个可用的宽度。

我已经实现了这里build议的自定义布局。

有我的自定义布局search.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" style="?attr/actionButtonStyle" android:layout_width="fill_parent" android:layout_height="match_parent" android:layout_gravity="fill_horizontal" android:focusable="true" > <FrameLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical|fill_horizontal" > <EditText android:id="@+id/search_query" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="left|center" android:background="@drawable/bg_search_edit_text" android:imeOptions="actionSearch" android:inputType="text" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right|center_vertical" android:src="@drawable/ic_search_arrow" /> </FrameLayout> </LinearLayout> 

而在MyActivity

 ActionBar actionBar = getSupportActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setDisplayShowCustomEnabled(true); actionBar.setDisplayShowTitleEnabled(false); actionBar.setIcon(R.drawable.ic_action_search); LayoutInflater inflator = (LayoutInflater) this .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View v = inflator.inflate(R.layout.search, null); actionBar.setCustomView(v); 

我怎样才能使自定义布局占据所有可用宽度的actionBar

请帮助。

这是一个窍门。 您所要做的就是使用RelativeLayout而不是LinearLayout作为主容器。 为其设置android:layout_gravity="fill_horizontal"是很重要的。 这应该做到这一点。

我自己一直在努力,并尝试了Tomik的回答。 但是,这并没有使布局开始时的全部可用宽度,只有当你添加一些东西到视图。

添加视图时,您需要设置LayoutParams.FILL_PARENT

 //I'm using actionbarsherlock, but it's the same. LayoutParams layout = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); getSupportActionBar().setCustomView(overlay, layout); 

这样它完全填充可用空间。 (您也可能需要使用Tomik的解决scheme)。

Tomik和Peterdk的答案是当你想要你的自定义视图占据整个操作栏时,甚至隐藏本地标题。

但是,如果您希望自定义视图与标题并排(并在显示标题后填充所有剩余空间),那么我可以在这里向您推荐来自用户Android-Developer的出色答案:

https://stackoverflow.com/a/16517395/614880

他的底层代码对​​我来说非常合适。

例如,您可以定义一个包含EditText元素的布局文件。

 <?xml version="1.0" encoding="utf-8"?> <EditText xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/searchfield" android:layout_width="match_parent" android:layout_height="match_parent" android:inputType="textFilter" > </EditText> 

你可以做

 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ActionBar actionBar = getActionBar(); // add the custom view to the action bar actionBar.setCustomView(R.layout.actionbar_view); EditText search = (EditText) actionBar.getCustomView().findViewById(R.id.searchfield); search.setOnEditorActionListener(new OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { Toast.makeText(MainActivity.this, "Search triggered", Toast.LENGTH_LONG).show(); return false; } }); actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME); } 

这是如何工作对我来说(从上面的答案,它显示默认标题和我的自定义视图也)。

 ActionBar.LayoutParams layout = new ActionBar.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); // actionBar.setCustomView(view); //last view item must set to android:layout_alignParentRight="true" if few views are there actionBar.setCustomView(view, layout); // layout param width=fill/match parent actionBar.setDisplayShowCustomEnabled(true);//must other wise its not showing custom view. 

我注意到的是, setCustomView(view)setCustomView(view,params)视图的宽度=匹配/填充父。 setDisplayShowCustomEnabled(boolean showCustom)

Android的启动器应用程序中有一个例子(我已经在这里创build了一个库),在处理壁纸挑选的类(“WallpaperPickerActivity”)中。

该示例显示您需要设置一个自定义的主题才能正常工作。 可悲的是,这只对我使用正常的框架,而不是支持库的一个。

这里的主题是:

styles.xml

  <style name="Theme.WallpaperPicker" parent="Theme.WallpaperCropper"> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:colorBackgroundCacheHint">@null</item> <item name="android:windowShowWallpaper">true</item> </style> <style name="Theme.WallpaperCropper" parent="@android:style/Theme.DeviceDefault"> <item name="android:actionBarStyle">@style/WallpaperCropperActionBar</item> <item name="android:windowFullscreen">true</item> <item name="android:windowActionBarOverlay">true</item> </style> <style name="WallpaperCropperActionBar" parent="@android:style/Widget.DeviceDefault.ActionBar"> <item name="android:displayOptions">showCustom</item> <item name="android:background">#88000000</item> </style> 

值-V19 / styles.xml

  <style name="Theme.WallpaperCropper" parent="@android:style/Theme.DeviceDefault"> <item name="android:actionBarStyle">@style/WallpaperCropperActionBar</item> <item name="android:windowFullscreen">true</item> <item name="android:windowActionBarOverlay">true</item> <item name="android:windowTranslucentNavigation">true</item> </style> <style name="Theme" parent="@android:style/Theme.DeviceDefault.Wallpaper.NoTitleBar"> <item name="android:windowTranslucentStatus">true</item> <item name="android:windowTranslucentNavigation">true</item> </style> 

编辑:有一个更好的办法来做到这一点,也支持库上的作品。 只需添加这行代码,而不是我上面写的:

 getSupportActionBar().setDisplayShowCustomEnabled(true);