2013-03-20 10 views
54

Chcę zaimplementować zwyczaj ActionBar które muszą wyglądać następująco:Jak mogę zaimplementować niestandardowy pasek akcji za pomocą przycisków niestandardowych w systemie Android?

enter image description here

więc pytania:

  1. W jaki sposób można wdrożyć przycisku niestandardowego widoku: jak tylko jakiś obraz?
  2. Jak narysować linię na górze ActionBar?
  3. A jak mogę zaimplementować przyciski bez linii rozdzielających: dodać zakładki na ActionBar lub co?
+1

Sprawdź tę bibliotekę, istnieje wiele dostępnych przykładów: http://actionbarsherlock.com/ –

Odpowiedz

142

enter image description here

Jest to dość dużo jak najbliżej dostaniesz, jeśli chcesz korzystać z ActionBar API. Nie jestem pewien, czy możesz umieścić kolorowy pasek powyżej ActionBar bez wykonywania jakiegoś dziwnego hakowania Window, to nie jest warte problemów. Jeśli chodzi o zmianę MenuItems, możesz je skrócić za pomocą stylu. To byłoby coś takiego, ale nie testowałem tego.

<style name="MyTheme" parent="android:Theme.Holo.Light"> 
    <item name="actionButtonStyle">@style/MyActionButtonStyle</item> 
</style> 

<style name="MyActionButtonStyle" parent="Widget.ActionButton"> 
    <item name="android:minWidth">28dip</item> 
</style> 

Oto jak nadmuchać i dodać niestandardowy układ do ActionBar.

// Inflate your custom layout 
    final ViewGroup actionBarLayout = (ViewGroup) getLayoutInflater().inflate(
      R.layout.action_bar, 
      null); 

    // Set up your ActionBar 
    final ActionBar actionBar = getActionBar(); 
    actionBar.setDisplayShowHomeEnabled(false); 
    actionBar.setDisplayShowTitleEnabled(false); 
    actionBar.setDisplayShowCustomEnabled(true); 
    actionBar.setCustomView(actionBarLayout); 

    // You customization 
    final int actionBarColor = getResources().getColor(R.color.action_bar); 
    actionBar.setBackgroundDrawable(new ColorDrawable(actionBarColor)); 

    final Button actionBarTitle = (Button) findViewById(R.id.action_bar_title); 
    actionBarTitle.setText("Index(2)"); 

    final Button actionBarSent = (Button) findViewById(R.id.action_bar_sent); 
    actionBarSent.setText("Sent"); 

    final Button actionBarStaff = (Button) findViewById(R.id.action_bar_staff); 
    actionBarStaff.setText("Staff"); 

    final Button actionBarLocations = (Button) findViewById(R.id.action_bar_locations); 
    actionBarLocations.setText("HIPPA Locations"); 

Oto układ niestandardowy:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:enabled="false" 
    android:orientation="horizontal" 
    android:paddingEnd="8dip" > 

    <Button 
     android:id="@+id/action_bar_title" 
     style="@style/ActionBarButtonWhite" /> 

    <Button 
     android:id="@+id/action_bar_sent" 
     style="@style/ActionBarButtonOffWhite" /> 

    <Button 
     android:id="@+id/action_bar_staff" 
     style="@style/ActionBarButtonOffWhite" /> 

    <Button 
     android:id="@+id/action_bar_locations" 
     style="@style/ActionBarButtonOffWhite" /> 

</LinearLayout> 

Oto układ kolor taśmy: Aby z niego skorzystać, wystarczy użyć merge w jakikolwiek układ nadmuchać w setContentView.

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="@dimen/colorstrip" 
    android:background="@android:color/holo_blue_dark" /> 

Oto Button style:

<style name="ActionBarButton"> 
    <item name="android:layout_width">wrap_content</item> 
    <item name="android:layout_height">wrap_content</item> 
    <item name="android:background">@null</item> 
    <item name="android:ellipsize">end</item> 
    <item name="android:singleLine">true</item> 
    <item name="android:textSize">@dimen/text_size_small</item> 
</style> 

<style name="ActionBarButtonWhite" parent="@style/ActionBarButton"> 
    <item name="android:textColor">@color/white</item> 
</style> 

<style name="ActionBarButtonOffWhite" parent="@style/ActionBarButton"> 
    <item name="android:textColor">@color/off_white</item> 
</style> 

Oto kolory i wymiary użyłem:

<color name="action_bar">#ff0d0d0d</color> 
<color name="white">#ffffffff</color> 
<color name="off_white">#99ffffff</color> 

<!-- Text sizes --> 
<dimen name="text_size_small">14.0sp</dimen> 
<dimen name="text_size_medium">16.0sp</dimen> 

<!-- ActionBar color strip --> 
<dimen name="colorstrip">5dp</dimen> 

Jeśli chcesz dostosować go bardziej niż to , możesz w ogóle nie używać ActionBar, ale nie poleciłbym tego.Można również rozważyć czytania przez Android Design Guidelines aby uzyskać lepsze wyobrażenie o tym, jak zaprojektować ActionBar.

Jeśli zdecydujesz się zrezygnować z ActionBar i użyć własnego układu zamiast, należy upewnić się, aby dodać długi action-stanie Toasts gdy użytkownicy naciśnij "MenuItems". Można to łatwo osiągnąć using this Gist.

+1

Dzięki człowieku! Świetna odpowiedź – MainstreamDeveloper00

+1

+1 świetne rzeczy. – meh

+1

+1 wspaniała odpowiedź! Możesz również sprawdzić [oficjalny przewodnik programisty ActionBar] (http://developer.android.com/guide/topics/ui/actionbar.html), który daje wiele porad – Michael

3

1 Można użyć odkształcalne

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:id="@+id/menu_item1" 
     android:icon="@drawable/my_item_drawable" 
     android:title="@string/menu_item1" 
     android:showAsAction="ifRoom" /> 
</menu> 

2 Utwórz styl na pasku akcji i użyć niestandardowego tła:

<resources> 
    <!-- the theme applied to the application or activity --> 
    <style name="CustomActivityTheme" parent="@android:style/Theme.Holo"> 
     <item name="android:actionBarStyle">@style/MyActionBar</item> 
     <!-- other activity and action bar styles here --> 
    </style> 
    <!-- style for the action bar backgrounds --> 
    <style name="MyActionBar" parent="@android:style/Widget.Holo.ActionBar"> 
     <item name="android:background">@drawable/background</item> 
     <item name="android:backgroundStacked">@drawable/background</item> 
     <item name="android:backgroundSplit">@drawable/split_background</item> 
    </style> 
</resources> 

3 Styl ponownie android: actionBarDivider

android documentation jest bardzo przydatny do tego.

1

Proszę napisać następujący kod w menu.xml pliku:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:my_menu_tutorial_app="http://schemas.android.com/apk/res-auto" 
     xmlns:tools="http://schemas.android.com/tools" 
     tools:context="com.example.mymenus.menu_app.MainActivity"> 
<item android:id="@+id/item_one" 
     android:icon="@drawable/menu_icon" 
     android:orderInCategory="l01" 
     android:title="Item One" 
     my_menu_tutorial_app:showAsAction="always"> 
     <!--sub-menu--> 
     <menu> 
      <item android:id="@+id/sub_one" 
       android:title="Sub-menu item one" /> 
      <item android:id="@+id/sub_two" 
       android:title="Sub-menu item two" /> 
     </menu> 

także napisać ten kod java aktywności pliku klasy:

public boolean onOptionsItemSelected(MenuItem item) 
{ 
    super.onOptionsItemSelected(item); 
    Toast.makeText(this, "Menus item selected: " + 
     item.getTitle(), Toast.LENGTH_SHORT).show(); 
    switch (item.getItemId()) 
    { 
     case R.id.sub_one: 
      isItemOneSelected = true; 
      supportInvalidateOptionsMenu(); 
      return true; 
     case MENU_ITEM + 1: 
      isRemoveItem = true; 
      supportInvalidateOptionsMenu(); 
      return true; 
     default: 
      return false; 
    } 
} 

Jest to najprostszy sposób, aby wyświetlić menu w pasku akcji.

+2

Proszę zaksięgować kod jako tekst, a nie obrazy. – laalto

+0

Ok ,, Dziękuję .. :-) –

Powiązane problemy