Як відобразити власний вигляд у ActionBar?


92

Я хочу відобразити власний пошук на панелі дій (для цього я використовую ActionBarSherlock).

Я зрозумів:

введіть тут опис зображення

Але я хочу, щоб спеціальний макет (поле edittext) займав всю доступну ширину.

Я застосував власний макет, як запропоновано тут .

Існує мій власний макет 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?

Допоможіть, будь ласка.


Чи можете ви встановити заголовок за допомогою настроюваного подання?
Рой Лі

Відповіді:


95

Для цього є хитрість. Все, що вам потрібно зробити, це використовувати, RelativeLayoutа не LinearLayoutяк основний контейнер. Важливо android:layout_gravity="fill_horizontal"налаштуватися на це. Це має зробити це.


3
@Tomik Не могли б ви поглянути на мій сценарій? stackoverflow.com/questions/16516306/… У мене відсутній заголовок після встановлення спеціального подання.
Рой Лі

36

Я сам боровся з цим і спробував відповідь Томіка. Однак це не зробило макет на всю доступну ширину при запуску, лише коли ви додаєте щось у подання.

Вам потрібно буде встановити 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); 

Таким чином він повністю заповнює наявний простір. (Можливо, вам доведеться скористатися розчином Томіка).


2
+1, насправді, це спрацювало у мене лише після додавання LayoutParams, thnx
Махмуд Бадрі

1
яке значення накладання?
androidevil

2
@androider - це ваш власний вигляд. Або завищений з xml, або створений у коді.
Більтон

8

Ось як це працювало для мене (зверху відповіді відображали як заголовок за замовчуванням, так і мій власний вигляд).

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 (логічне шоуCustom)


6

Відповіді від Tomik та Peterdk працюють тоді, коли ви хочете, щоб ваш власний вигляд займав весь рядок дій, навіть приховуючи рідну назву.

Але якщо ви хочете, щоб ваш власний вигляд жив пліч-о-пліч із заголовком (і заповнював увесь залишився простір після відображення заголовка), тоді я можу звернутися до чудової відповіді від розробника Android-розробника тут:

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

Його код внизу відмінно працював для мене.


3

Наприклад, ви можете визначити файл макета, який містить елемент 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);


    }

врятував мої n годин .. Дякую
CrazyMind

1

Є приклад у програмі запуску 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>

value-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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.