2013-04-18 10 views
14

Zajmuję się tworzeniem jednej aplikacji, w której muszę dodać niestandardowy układ na pasku akcji. Dodanie niestandardowego układu jest wykonywane, ale kiedy dodaję elementy menu na pasku akcji, mój niestandardowy układ zmienia jego położenie z prawej strony paska akcji na środek paska akcji. Poniżej znajduje się obraz jaki osiągnąłem do tej pory.Jak zmienić pozycję pozycji menu na pasku czynności

Done till here

chcę coś takiego na actionbar.

Like this

niestandardowy układ (żółty przycisk) po prawej stronie większości przedmiotów actionbar i menu w środku.

Dodanie mój kod, aby osiągnąć ten niestandardowy układ stosując natywną android actionbar:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    getActionBar().setDisplayHomeAsUpEnabled(true); 
    getActionBar().setHomeButtonEnabled(true); 

    actionBar = getActionBar(); 
    actionBar.setDisplayShowTitleEnabled(false); 
    actionBar.setDisplayUseLogoEnabled(false); 
    actionBar.setDisplayHomeAsUpEnabled(false); 
    actionBar.setDisplayShowCustomEnabled(true); 
    cView = getLayoutInflater().inflate(R.layout.header, null); 
    actionBar.setCustomView(cView); 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.websearch_menu, menu); 
    return true; 

} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    switch (item.getItemId()) { 

    case android.R.id.home: 
     finish(); 

    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

Jak można to osiągnąć?

Każdy rodzaj pomocy zostanie doceniony.

Odpowiedz

3

Zakładam, że ustawiasz niestandardowy widok jako niestandardowy widok na pasku akcji. Jeśli używasz ActionbarSherlock, możesz zamiast tego dodać niestandardowy widok jako zwykły element menu i ustawić dla niego widok akcji za pomocą .setActionView(yourCustomView or yourCustomLayoutId). Następnie można ustawić .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS), aby wyświetlić widok. Po prostu upewnij się, że Twój niestandardowy widok jest ustawiony na szerokość wrap_content lub w przeciwnym razie wypchnie pozostałe elementy menu z ekranu. Może to również działać bez ActionbarSherlock, ale nie próbowałem go jeszcze.

EDIT: Spróbuj modyfikując metodę

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.websearch_menu, menu); 

    // add this 
    menu.add(Menu.NONE, 0, Menu.NONE, "custom") 
     .setActionView(R.layout.header) 
     .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); 

    return true; 
} 

onCreateOptionsMenu i usunąć to z onCreate metody

actionBar.setDisplayShowCustomEnabled(true); 
cView = getLayoutInflater().inflate(R.layout.header, null); 
actionBar.setCustomView(cView); 

EDIT:

Jeśli trzeba odwoływać się do widoków z niestandardowego układu, możesz to zrobić w swojej metodzie onCreateOptionsMenu w następujący sposób (uwaga: napisałem ten kod w przeglądarce, więc nie mam gwarancji, że nie zrobiłem literówki lub rzeczy):

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    // inflate the menu and add the item with id viewId, 
    // which has your layout as actionview 

    View actionView = menu.getItem(viewId).getActionView(); 
    View viewFromMyLayout = actionView.findViewById(R.id.viewFromMyLayout); 

    // here you can set listeners to your view or store a reference 
    // to it somewhere, so you can use it later 

    return true; 
} 
+0

Dodałem mój kod. Używam domyślnego paska zadań Android. – Anupam

+0

Dodałem kod jak to zrobić z ActionbarSherlock, mam nadzieję, że to samo z domyślnym Actionbar – Thrakbad

+0

Jesteś kołysany gość. Dziękuję bardzo, uratowałeś mnie przed stworzeniem kompletnego układu niestandardowego, a następnie nadmuchania go do paska akcji. Thanx! – Anupam

0

Jednym ze sposobów osiągnięcia tego jest wywołanie invalidateOptionMenu oraz w metodzie onCreateOptionsMenu umieszczenie elementów zgodnie z kolejnością ich umieszczania.

BTW, jeśli używasz ActionBarSherlock, ta metoda jest dostępna, więc zignoruj ​​ostrzeżenia Lint o tym.

+0

Czy możesz wskazać mi, jak to osiągnąć? Każdy rodzaj kodu będzie dla mnie pomocą. – Anupam

+0

Tak, jeśli chcesz zmienić kolejność elementów, zapisz konfigurację kolejności elementów i wywołaj metodę invalidateOptionMenu(). Następnie w metodzie onCreateOptionsMenu() sprawdź zapisane konfiguracje i za pomocą pętli przejrzyj wszystkie pozycje, które chcesz wstawić według ich kolejności, i dodaj je kolejno do menu, jeden po drugim, dynamicznie. Powinieneś to zrobić, uzyskując dostęp do zmiennej "menu" onCreateOptionsMenu(). Jeśli chcesz zawrzeć "statyczne" elementy akcji za pomocą nadmuchiwania, to dobrze, po prostu znajdź gdzie umieścić resztę w samym menu. –

2

Kolejność pozycji menu zostanie ustawiona zgodnie z ich kolejnością w pliku XML, który jest zawyżony.

Dlatego wszystko, co musisz zrobić, to zmienić kolejność w pliku XML, jak chcesz.

10

Po prostu użyj orderInCategory w swoim pliku xml i będzie on zamawiał od mniejszej liczby do większej (od lewej strony paska akcji).Takich jak:

<item 
    android:id="@+id/Refresh" 
    android:icon="@drawable/ic_action_refresh" 
    android:showAsAction="ifRoom" 
    android:title="@string/refresh" 
    android:orderInCategory="2"/> 
<item 
    android:id="@+id/Search" 
    android:icon="@drawable/ic_action_action_search" 
    android:showAsAction="ifRoom|collapseActionView" 
    android:title="@string/search" 
    android:orderInCategory="1"/> 

Mimo, Odśwież poz nadchodzi pierwszy w pliku xml, to nie będzie pierwszy. Ale ikona od lewej do prawości na pasku akcji będzie pierwsza zgodnie z atrybutem orderInCategory.