2012-02-14 10 views
17

On Ice Cream Sandwich:zdefiniowane przez użytkownika ActionBar działania Widok: coraz szerokość prawo

szukam dodać AutoCompleteTextView do ActionBar poprzez standardową Action View mechanizmu (bo SearchView nie jest dostępny pre-ICS i ja m”również za pomocą ActionBarSherlock)

<item android:id="@+id/menu_search" android:actionViewClass="com.example.AutoCompleteActionView" android:showAsAction="ifRoom" android:title="@string/address"></item> 
<item android:id="@+id/menu_close" android:icon="@drawable/ic_menu_close_clear_cancel" android:showAsAction="always"></item> 
<item android:id="@+id/menu_ok" android:icon="@drawable/ic_menu_ok" android:showAsAction="always"></item> 

To działa, ale domyślnie nie zużywa dostępnego miejsca w pasku akcji, który bym chciał.

Szukałem na source for the SearchView i widziałem jak to nadpisuje onMeasure, i zrobić to samo dla własnej klasy, że pochodzi od AutoCompleteTextView. Kiedy to zrobię, AutoCompleteTextView zużywa całą przestrzeń, nie pozostawiając miejsca dla dwóch pozycji menu, które chcę wyświetlić na prawo od niego.

Wygląda na to, że szerokość zwrócona z MeasureSpec.getSize() nie uwzględnia pozostałych dwóch pozycji menu, gdy MeasureSpec.getMode() jest MeasureSpec.AT_MOST.

Ktoś zrobił coś podobnego? Jakieś sugestie?

Dzięki, Damian

+0

Jest szansa, że ​​znalazłeś już rozwiązanie? Muszę zastąpić element menu odświeżania widokiem akcji, który zawiera animację, ale widok akcji jest mniejszy niż element menu, mimo że utworzę go przy użyciu prawidłowych wymiarów układu. – Matthias

+0

Nie, obawiam się, że nie. – Damian

+4

Właściwie zrobiłem to dzisiaj.Jest to oczywiście obejście problemu, ale to, co zrobiłem, to: ActionBar renderuje widoki elementów za pomocą wewnętrznej klasy widoku, ale przypisuje te widoki identyfikatorom pozycji menu. Oznacza to, że możesz znaleźćViewById (menuItemId). Następnie wziąłem zmierzoną szerokość i zmierzoną wysokość tego widoku i ustawię ją jako minimalną szerokość/wysokość w widoku akcji. Działa jak marzenie. – Matthias

Odpowiedz

13

myślę, że to może pomóc:

Tworzenie menu składany z niestandardowy układ:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item 
    android:id="@+id/menuSearch" 
    android:showAsAction="always|collapseActionView" android:icon="@drawable/action_search" android:actionLayout="@layout/collapsible_absearch"> 
    </item> 
</menu> 

Jest to układ niestandardowy:

<?xml version="1.0" encoding="utf-8"?> 
<AutoCompleteTextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/ab_Search" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:hint="@string/search" /> 

Następnie w swojej działalności:

public boolean onCreateOptionsMenu(Menu menu) { 
    getSupportMenuInflater().inflate(R.menu.activitymenu, menu); 

    MenuItem menuItem=menu.findItem(R.id.menuSearch); 

    menuItem.setOnActionExpandListener(new OnActionExpandListener() { 
     @Override 
     public boolean onMenuItemActionExpand(MenuItem item) { 
      mAbSearch=(AutoCompleteTextView) item.getActionView().findViewById(R.id.ab_Search); 

      // Set your adapter and do whatever you want 

      return true; 
     } 
    }); 
+0

Ten przykład jest dość blisko, tylko jedna rzecz do komentowania, jeśli ktoś chce tego użyć z kompatybilnym z Actionbar, musisz zmienić przestrzeń nazw właściwości actionLayout, tak jak to: xmlns: yourapp = "http: // schemas .android.com/apk/res-auto "> yourapp: actionLayout =" @ layout/action_search " – Ripityom

+0

Rozpoczęcie od zwiniętego elementu menu całkowicie zmienia interakcję, więc myślę, że ta odpowiedź wydaje się dobra, ale nie jest całkowicie poprawna . Proszę rozważyć zaakceptowanie wiadomości od Sergio Viudes poniżej: http://stackoverflow.com/questions/9276039/user-defined-actionbar-action-view-getting-the-width-right/11602211#11602211 – faraday

7

Nie udało mi się uzyskać sugestii Matthiasa do pracy w kodzie (być może czegoś mi brakowało), ale dodanie atrybutu minWidth do najwyższego elementu w moim Widoku Działania spowodowało powstanie problemu.

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="64dip" 
    android:minWidth="64dip" 
    android:layout_height="match_parent" 
    android:gravity="center" > 

    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"   
     android:layout_gravity="center" 
     android:id="@+id/imageViewAnimatedProgressSpinner" 
     android:background="@drawable/animated_progress_spinner" /> 

</FrameLayout> 
+0

to działa, ale tak naprawdę nie jest Świetnie z określoną szerokością. Czy znalazłeś lepszą odpowiedź, od kiedy? EDYCJA Znalazłem coś: http://stackoverflow.com/questions/22823910/make-an-android-actionbars-actionviews-width-match-the-actionbars-width –

3

To pomaga ?:

ActionBar.LayoutParams layoutParams = new LayoutParams(android.app.ActionBar.LayoutParams.MATCH_PARENT, android.app.ActionBar.LayoutParams.MATCH_PARENT); 
    View customNav = LayoutInflater.from(getSupportActionBar().getThemedContext()).inflate(R.layout.your_layout, null); 
    getSupportActionBar().setCustomView(customNav, layoutParams); 
    getSupportActionBar().setDisplayShowCustomEnabled(true); 
2

może być lata świetlne późno, ale jeśli ktoś przychodzi patrząc wykonaj następujące czynności w widokach działań, aby je stylizowany jak pasek ikon domyślną akcję,

//Define a style which extends the themed action button in styles.xml, if you want you can use references to have dynamic styles.. this is an example for holo theme 
<style name="ActionButtonStyle" parent="@android:style/Widget.Holo.ActionButton"> 

</style> 

//For your action view, use this as the style, I find the issue with Progress bars and hence //the example, 

<?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" 
    style="@style/ActionButtonStyle" > 

    <ProgressBar 
     android:id="@+id/progressBar2" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" > 
    </ProgressBar> 

</LinearLayout> 
1
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="wrap_content" 
       android:layout_height="match_parent"> 
    <EditText xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:id="@+id/visibility_search_edit_text"/> 
</RelativeLayout> 

kredytowych do tego postu: Make an Android ActionBar's ActionView's Width match the ActionBar's width. To sprawi, że będzie się rozciągać.

Powiązane problemy