50

Przeszukałem interwebs (np. Dokumentację Androida, odpowiedzi tutaj itp.), Aby uzyskać odpowiedź na pytanie, które uważam za dość banalne. W jaki sposób uzyskać półprzezroczysty pasek akcji, taki jak w Google Music i YouTube (linki to przykłady obrazów)?Własne przezroczyste urządzenie Android ActionBar

Chcę, aby zawartość wideo była pełnoekranowa i nie była ograniczona/popychana przez pasek akcji, a jednocześnie korzystała z zalet wbudowanego składnika interfejsu użytkownika. Mogę oczywiście użyć całkowicie niestandardowego widoku, ale wolałbym raczej wykorzystać pasek akcji, jeśli to możliwe.

Oczywista

<activity 
    android:name="videoplayer" 
    android:theme="@android:style/Theme.Holo" 
    android:launchMode="singleTop" 
    android:configChanges="keyboardHidden|orientation"/> 

aktywny

// Setup action bar 
ActionBar actionBar = getActionBar(); 
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 
View customActionBarView = getLayoutInflater().inflate(R.layout.player_custom_action_bar, null); 
actionBar.setCustomView(customActionBarView, 
         new ActionBar.LayoutParams(ActionBar.LayoutParams.MATCH_PARENT, 
                R.dimen.action_bar_height)); 
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); 

menu

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:id="@+id/button1" 
     android:icon="@drawable/button1" 
     android:showAsAction="always"/> 

    <item 
     android:id="@+id/button2" 
     android:icon="@drawable/button2" 
     android:showAsAction="always"/> 
</menu> 

Niestandardowe ActionBar Zobacz

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/custom_action_bar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" 
    android:gravity="center" 
    android:background="@color/TranslucentBlack"> 

    <!--Home icon with arrow--> 
    <ImageView 
     android:id="@+id/home" 
     android:src="@drawable/home" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent"/> 

    <!--Another image--> 
    <ImageView 
     android:id="@+id/image" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:visibility="visible"/> 

    <!--Text if no image--> 
    <TextView 
     android:id="@+id/text" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:gravity="center_vertical" 
     android:visibility="gone"/> 

    <!--Title--> 
    <TextView 
     android:id="@+id/title" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:paddingLeft="20dp" 
     android:gravity="center_vertical"/> 
</LinearLayout> 
+0

tutaj odpowiedzi: http://stackoverflow.com/questions/16939814/android-util-androidruntimeexception-requestfeature-must-be-called-before-add – user3167086

Odpowiedz

100

Jeśli chcesz, aby Twoja aktywność być pełny ekran, ale nadal wykazują actionbar, ale z alfa trzeba zwrócić overlaymode dla actionbar w onCreate() swojej działalności:

getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY); 

//getWindow().requestFeature(WindowCompat.FEATURE_ACTION_BAR_OVERLAY); << Use this for API 7+ (v7 support library) 

Następnie po możesz zadzwonić setContentView(..) (od setContentView(..) również inicjuje pasek akcji obok ustawiania zawartości) można ustawić tło do pobrania na pasku akcji:

getActionBar().setBackgroundDrawable(getResources().getDrawable(R.drawable.actionbar_bg)); 

które mogą być odkształcalne kształt z alfa umieścić w res/odkształcalne:

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> 
    <solid android:color="#BB000000" /> 
</shape> 

Można też to zrobić całkowicie programowo poprzez stworzenie ColorDrawable:

getActionBar().setBackgroundDrawable(new ColorDrawable(Color.argb(128, 0, 0, 0))); 

Inaczej oczywiście można całkowicie ukryj pasek akcji; w takim przypadku można ustawić niestandardowy motyw na swojej działalności w swoim manifeście:

@android:style/Theme.NoTitleBar.Fullscreen 

lub programowo przez wywołanie

getActionBar().hide(); 
+0

Dzięki! Pomyślałem, że to coś prostego, czego mi brakowało. – colabug

+0

Czy wiesz, jak ustawić wysokość paska akcji? Mój wymiar nie wydaje się mieć żadnego efektu! 'actionBar.setCustomView (customActionBarView, new ActionBar.LayoutParams (ActionBar.LayoutParams.MATCH_PARENT, R.dimen.action_bar_height));' – colabug

+0

nie jestem pewien, czy rzeczywiście możesz zmienić wysokość paska akcji, nie zgaduję, ale jeśli to możliwe, polecam go, ponieważ jest to definitywny składnik interfejsu użytkownika w strukturze plastra miodu. – MrJre

9

Myślę, że powinieneś być w stanie to zrobić z flagą Okno FEATURE_ACTION_BAR_OVERLAY.

Zanim zadzwonisz setContentView() w swojej działalności,

Call:

getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY); 

I będzie używać pokrył ActionBar zamiast obniżając swoje okno.

4

Oto jak mam to do pracy:

1) prośba o actionbar nakładki programowo przez wywołanie

 getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY); 

to "requestFeature() należy składać do swojej działalności" Metoda onCreate() przed wywołaniem "setContentView (R.layout.my_layout)":

2) ustawić actionbar kolor wywołując setBackgroundDrawable() tak:

getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.parseColor("#00212121"))); 

metoda ta wymaga albo odniesienie względem rozciągliwej lub można również użyć parsera kolorów do analizowania wartości koloru hex (pierwsze 2 cyfry służą do kanału alfa zaczynająC# 00 do #FF)

Zauważ, że używam actionBarSherlok getSupportActionBar(), ale powinno to działać z dowolnym paskiem akcji.

Jeśli wciąż nie mogę uzyskać to do pracy, warto dodać to do Twojego stylu motywu

<item name="windowActionBarOverlay">true</item> 
<item name="android:actionBarStyle">@style/ActionBar.Transparent.Example</item> 
<item name="android:windowActionBarOverlay">true</item> 
5

Powyższy kod jest absolutnie poprawne dla dokonywania pasek akcji.

Zamiast

getActionBar().setBackgroundDrawable(new ColorDrawable(Color.argb(128, 0, 0, 0))) 

użytku

getActionBar().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); 

W ten sposób będziesz w stanie zobaczyć pasek działanie w pełni przejrzyste.

12

oprócz poprawnej odpowiedzi, jeśli używasz AppcomatActivity, zadzwoń supportRequestWindowFeature zamiast

stara wersja: getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);

chcesz użyć:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    supportRequestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY); 
    super.onCreate(savedInstanceState); 
} 
+0

Wreszcie!Dzięki człowieku :) – Analizer

+0

Dzięki! To zadziałało dla mnie. –