Я хочу отображать настраиваемый поиск на панели действий (для этого я использую ActionBarSherlock).
Я понял:
Но я хочу, чтобы пользовательский макет (поле редактирования текста) занимал всю доступную ширину.
Я реализовал собственный макет, как предлагается здесь .
Вот мой собственный макет 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"
подготовиться к этому. Это должно сработать.источник
Я сам боролся с этим и попробовал ответить Томика. Однако это не сделало макет полностью доступным при запуске, только когда вы что-то добавляете в представление.
Вам нужно будет установить
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).
источник
Вот как это сработало для меня (из приведенных выше ответов он также показывал как заголовок по умолчанию, так и мое пользовательское представление).
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 (логическое showCustom)источник
Ответы Томика и Петердка работают, когда вы хотите, чтобы ваше настраиваемое представление занимало всю панель действий, даже скрывая собственный заголовок.
Но если вы хотите, чтобы ваше пользовательское представление отображалось рядом с заголовком (и заполняло все оставшееся пространство после отображения заголовка), могу я отослать вас к отличному ответу пользователя 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); }
источник
В приложении для запуска Android есть пример (здесь я сделал из него библиотеку) внутри класса, который обрабатывает выбор обоев («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);
источник