2013-03-15 12 views
20

Jak zbudować ActionBar ze zwijanym widokiem wyszukiwania z widocznym pojedynczym akcją, gdy widok wyszukiwania jest rozwinięty? Aby być bardziej opisowy, to jest to, czego potrzebuję:Android ActionBar: zwijany SearchView z przyciskiem akcji

enter image description here pamiętać, że istnieją inne pozycje menu i android:uiOptions="splitActionBarWhenNarrow" jest zdefiniowany w AndroidManifest.xml.

Próbowałem ustawić niestandardowy układ szukanej frazy:

menu.xml

<item 
    android:id="@+id/menu_search" 
    android:actionLayout="@layout/actionbar_search" 
    android:icon="@drawable/action_search" 
    android:showAsAction="always|collapseActionView" 
    android:title="@string/search" /> 

actionbar_search.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="right" 
    android:orientation="horizontal" > 

    <com.actionbarsherlock.widget.SearchView 
     android:id="@+id/search_view" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:iconifiedByDefault="false" 
     android:queryHint="@string/search_hint" /> 

    <ImageButton 
     android:id="@+id/add_item" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     style="@style/Widget.Sherlock.ActionButton" 
     android:src="@drawable/content_new"/> 

</LinearLayout> 

Ale defaul t widok wyszukiwania przyjmuje całą dostępną szerokość, a przycisk nie jest widoczny. Nie wiem, jak wymusić SearchView, aby wypełnić całą dostępną przestrzeń między ikoną aplikacji i elementem menu. Wszystko, co znalazłem, to własność android:maxWidth, ale to pozwala tylko na zakodowany wymiar i szukam bardziej elastycznego rozwiązania. Próbowałem też RelativeLayout z android:layout_toRightOf="@id/search_view" bez powodzenia.

Odpowiedz

9

Po uwzględnieniu sugestii komentarzach, wiele googling i testów udało się uzyskać pożądany efekt. Nie jestem dumny z tego rozwiązania, ale działa, nie jest zbyt skomplikowany i powinien wystarczyć w tej sprawie.

W życiorysie co robiłam:

  1. Umieszczony SearchView ze zwyczajem "Dodaj element" przycisk w customView z ActionBar.
  2. Usunięto collapseActionView i android:actionLayout od szukanej w menu.xml
  3. Zwijanie/rozszerza SearchView programowo.

Kod pozwalający lepiej zrozumieć, co zrobiłem. Może to może być przydatne dla kogoś.

menu.xml

<item 
    android:id="@+id/menu_search" 
    android:icon="@drawable/action_search" 
    android:showAsAction="always" 
    android:title="@string/search" /> 

// ... other menu items 

actionbar_search.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="right" 
    android:orientation="horizontal"> 

    <com.actionbarsherlock.widget.SearchView 
     android:id="@+id/search_view" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:iconifiedByDefault="false" 
     android:queryHint="@string/search_hint" 
     android:visibility="invisible" /> 

    <ImageButton 
     android:id="@+id/add_item" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     style="@style/Widget.Sherlock.ActionButton" 
     android:src="@drawable/content_new" 
     android:title="@string/add_item" /> 

</LinearLayout> 

główną działalność.java

@Override 
public void onCreate(Bundle savedInstanceState) { 
    // ... 
    actionBar.setCustomView(R.layout.actionbar_search); 
    actionBarCustomView = ab.getCustomView(); 
    searchView = ((SearchView) actionBarCustomView.findViewById(R.id.search_view)); 
    searchView.setOnCloseListener(new SearchView.OnCloseListener() { 
     @Override 
     public boolean onClose() { 
      searchView.setVisibility(View.INVISIBLE); 
      return false; 
     } 
    }); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     // ... 
     case R.id.menu_search: 
      if (searchView.getVisibility() == View.VISIBLE) { 
       searchView.setIconified(true); 
       searchView.setVisibility(View.INVISIBLE); 
      } else { 
       searchView.setMaxWidth(abCustomView.getWidth() - addButton.getWidth()); 
       searchView.setVisibility(View.VISIBLE); 
       searchView.setIconified(false); 
      } 
      break; 
     // ... 
    } 
    return true; 
} 

@Override 
public void onBackPressed() { 

    if (searchView.getVisibility() == View.VISIBLE) { 
     searchView.setIconified(true); 
     searchView.setVisibility(View.INVISIBLE); 
     return; 
    } 

    // ... 
} 
+0

Witam, próbowałem powyższego rozwiązania, ale w ogóle nie działa. W rzeczywistości nie widzę żadnego elementu akcji. – AndoAiron

+0

Czy możesz publikować fragmenty kodu (np. Jako istotę)? Spędziłem kilka dni na analizowaniu i testowaniu, myślę, że mogę pomóc. –

+0

gdzie powinienem zamieścić fragment kodu? Nie mogę opublikować mojego kodu problemu tutaj jako komentarza. Możesz także pomóc mi to osiągnąć: http://stackoverflow.com/questions/15947557/sherlockactionbar-z-autocompletetextview-and-other-items?noredirect=1#comment22723847_15947557 – AndoAiron

2

Możesz to zrobić tylko używając pliku menu.xml.

Ustaw inną ikonę menu, aby zawsze była wyświetlana jako czynność. Twój menu.xml powinna wyglądać następująco:

<item 
    android:id="@+id/menu_search" 
    android:actionLayout="@layout/actionbar_search" 
    android:icon="@drawable/action_search" 
    android:showAsAction="always|collapseActionView" 
    android:title="@string/search" 
/> 
<item 
    android:id="@+id/your_other_menu_id" 
    android:showAsAction="always" 
    android:icon="@android:drawable/your_other_menu_ic" 
/> 
+0

Próbowałem tego podejścia. Jak już wspomniałem, są inne elementy menu i wszystkie z nich przepełniają dolny pasek akcji. I potrzebuję tej jednej akcji dodawania zawsze umieszczonej w prawym górnym rogu. –

+1

Szczegóły w tym przypadku to podzielony pasek działań, a nie zwijany widok wyszukiwania. Sprawdź link poniżej. Nie można ustawić tego zachowania za pomocą obiektów natywnych. Musisz utworzyć własny niestandardowy pasek akcji. http://stackoverflow.com/questions/8571754/android-split-action-bar-with-action-items-on-the-top-and-bottom – JPMagalhaes

+0

Dzięki za radę, ale już wypróbowałem też tę. Niestandardowy pasek akcji daje mi niestandardowy widok, gdy SearchView jest zwinięty. Następnie mam mój pojedynczy przycisk na górnym pasku, a te tworzą menu.xml na dole. Problem dotyczy rozszerzenia SearchView. Muszę go wymusić, aby wypełnić całą dostępną przestrzeń między ikoną aplikacji i pojedynczym elementem akcji. Próbowałem zrozumieć, co dzieje się w 'onMeasure()' w klasie SearchView, ale nie do końca rozumiem, co mogę z tym zrobić, a jeśli jest to w ogóle właściwy kierunek. Każda pomoc będzie doceniona. –

1

prostu można to zrobić jak ten

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main, menu); 
    MenuItem searchItem = menu.findItem(R.id.action_search); 
    searchView = (SearchView) MenuItemCompat.getActionView(searchItem); 
    searchView.setIconified(true); //to be opened collapsed 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch(item.getItemId()){ 

     case R.id.action_search: 
      searchView.setIconified(false);// to Expand the SearchView when clicked 
      return true; 
    }  
    return false; 
} 

I w szukanej w menu.xml zrobić

showAsAction = "always"

Uwaga: Używam android.support.v7.widget.SearchView, ale w twoim przypadku nie ma to znaczenia

+1

nie działa dla mnie: (( –

+0

Czy ten kod jest przestarzały? – HMagdy

+0

@salma tak, masz prawo android.support.v7.widget.SearchView i android.widget.searchview jego sprawa dużo –

0

Wystarczy zmienić menu xml. prefiks showaction do nazwy Twojej aplikacji

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" > 

<item 
    android:id="@+id/menu_search" 
    android:actionLayout="@layout/actionbar_search" 
    android:icon="@drawable/action_search" 
    app:showAsAction="always|collapseActionView" 
    android:title="@string/search" 
/> 

</menu> 
Powiązane problemy