Jak wyświetlić własny widok na pasku akcji?

Chcę wyświetlić własne wyszukiwanie w pasku actionbar (używam do tego ActionBarSherlock).

Mam to:

Tutaj wpisz opis obrazka

Ale chcę, aby układ niestandardowy (pole edittext) zajmował całą dostępną szerokość.

Zaimplementowałem własny layout zgodnie z sugestią tutaj .

Jest mój Niestandardowy layout 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>

I w 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);

Jak zrobić niestandardowy układ, aby zajmował całą dostępną Szerokość actionBar?

Pomoc, proszę.

Author: Community, 2012-10-14

6 answers

Jest na to sztuczka. Wszystko, co musisz zrobić, to użyć RelativeLayout zamiast LinearLayout jako głównego kontenera. Ważne jest, aby android:layout_gravity="fill_horizontal" było ustawione. To powinno wystarczyć.

 94
Author: Tomik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-14 16:41:05

Sam się z tym zmagałem i spróbowałem odpowiedzi Tomika. Jednak to nie sprawiło, że układ był w pełni dostępny na początku, tylko po dodaniu czegoś do widoku.

Musisz ustawić LayoutParams.FILL_PARENT Podczas dodawania widoku:

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

W ten sposób całkowicie wypełnia dostępną przestrzeń. (Konieczne może być również użycie roztworu Tomika).

 34
Author: Peterdk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-20 15:05:32

Odpowiedzi z Tomika i Peterdka działają, gdy chcesz, aby Twój niestandardowy widok zajmował cały pasek akcji, nawet ukrywając natywny tytuł.

Ale jeśli chcesz, aby Twój niestandardowy widok działał obok tytułu (i wypełniał całą pozostałą przestrzeń po wyświetleniu tytułu), mogę skierować cię do doskonałej odpowiedzi od dewelopera Androida tutaj:

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

Jego kod na dole zadziałał idealnie dla mnie.

 6
Author: Mike Repass,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:19

Tak to działało dla mnie(z powyższych odpowiedzi pokazywał zarówno domyślny tytuł, jak i mój niestandardowy widok).

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.

Zauważyłem, że zarówno setCustomView(view) jak i setCustomView(view,params) widok width=dopasuj/wypełnij rodzic. setDisplayShowCustomEnabled (boolean showCustom)

 5
Author: Bharatesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-08 09:14:14

Na przykład można zdefiniować plik układu, który zawiera element 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> 

You can do

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);


    }
 3
Author: BoldHD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-03 07:47:31

Jest przykład w aplikacji uruchamiającej na Androida (że zrobiłem z niej bibliotekę, tutaj), wewnątrz klasy, która obsługuje zbieranie tapet ("WallpaperPickerActivity").

Przykład pokazuje, że musisz ustawić niestandardowy motyw, aby to działało. Niestety, to działało dla mnie tylko przy użyciu normalnego frameworka, a nie jednej z biblioteki wsparcia.

Oto Tematy:

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>

Wartość-v19 / style.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>

EDIT: istnieje lepszy sposób, aby to zrobić, który działa również na bibliotece wsparcia. Po prostu dodaj ten wiersz kodu zamiast tego, co napisałem powyżej:

getSupportActionBar().setDisplayShowCustomEnabled(true);
 1
Author: android developer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-07 22:45:57