如何在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);