Chcę używać ToolBar
zamiast ActionBar
, ale nie pokazuj mi menu na pasku narzędzi !!! Chcę ustawić menu, takie jak przyciski Odśwież lub Ustawienia w ActionBar
.
Kod Toolbar.xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
app:navigationContentDescription="@string/abc_action_bar_up_description"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:title="Main Page"
android:gravity="center"/>
Kod MainPage.java:
public class MainPage extends AppCompatActivity {
private Toolbar toolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_page);
toolbar = (Toolbar) findViewById(R.id.main_toolbar);
setSupportActionBar(toolbar);
if (getSupportActionBar() != null) {
getSupportActionBar().setTitle("Main Page");
}
toolbar.setSubtitle("Test Subtitle");
toolbar.inflateMenu(R.menu.main_manu);
}
}
kod main_menu.xml:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_main_setting"
android:icon="@drawable/ic_settings"
android:orderInCategory="100"
app:showAsAction="always"
android:actionLayout="@layout/toolbar"
android:title="Setting" />
<item
android:id="@+id/menu_main_setting2"
android:icon="@drawable/ic_settings"
android:orderInCategory="200"
app:showAsAction="always"
android:actionLayout="@layout/toolbar"
android:title="Setting" />
</menu>
Jak rozwiązać ten problem i wyświetlić menu Toolbar
? dzięki wszystkim kochani <3
Android Studio
i sprawdź ją. ToolBar nie powinien być niezależną jednostką.Odpowiedzi:
po prostu nadpisz onCreateOptionsMenu w ten sposób w swoim MainPage.java
źródło
Nie używaj setSupportActionBar (pasek narzędzi)
Nie wiem dlaczego, ale to działa dla mnie.
Aby wyświetlić pozycję menu, kliknij zrób to
źródło
Oto pełniejsza odpowiedź jako odniesienie do przyszłych odwiedzających. Zwykle używam paska narzędzi wsparcia, ale działa to równie dobrze.
1. Utwórz menu xml
To będzie w środku
res/menu/main_menu
.res
folder prawym przyciskiem myszy i wybierz Nowy> Plik zasobów systemu Android .main_menu
nazwę pliku.Wklej następującą treść jako początek.
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/action_add" android:icon="@drawable/ic_add" app:showAsAction="ifRoom" android:title="Add"> </item> <item android:id="@+id/action_settings" app:showAsAction="never" android:title="Settings"> </item> </menu>
Możesz kliknąć prawym przyciskiem myszy
res
i wybrać Nowy zasób obrazu, aby utworzyćic_add
ikonę.2. Napompuj menu
W swojej aktywności dodaj następującą metodę.
3. Obsługuj kliknięcia menu
Również w swojej aktywności dodaj następującą metodę:
Dalsza lektura
źródło
Musisz zastąpić ten kod w swojej aktywności:
i ustaw swój pasek narzędzi w ten sposób:
źródło
Jest to również potrzebne, aby zaimplementować jakąś akcję do każdej opcji menu.
źródło
Chociaż zgadzam się z tą odpowiedzią, ponieważ ma mniej linii kodu i działa:
Jak ustawić menu na pasku narzędzi w systemie Android
Moja sugestia byłaby taka, aby zawsze rozpoczynać projekt za pomocą kreatora Android Studio. W tym kodzie znajdziesz kilka stylów: -
<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
a użycie to:
<android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" /> </android.support.design.widget.AppBarLayout>
Ze względu na
no action bar theme
zadeklarowane wstyles.xml
, które jest stosowane doMain Activity
wAndroidManifest.xml
, nie ma wyjątków, więc musisz to tam sprawdzić.<activity android:name=".MainActivity" android:screenOrientation="portrait" android:theme="@style/AppTheme.NoActionBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
Toolbar
jest niezależnym bytem, jest zawsze dzieckiem,AppBarLayout
ponieważ znowu jest dzieckiemCoordinatorLayout
.OBIE:
Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar);
I:
Jak ustawić menu na pasku narzędzi w systemie Android
BĘDZIE DZIAŁAĆ.
Miłego kodowania :-)
źródło
W swoim działaniu zastąp tę metodę.
Spowoduje to zawyżenie poniższego menu:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/menu_main_setting" android:icon="@drawable/ic_settings" android:orderInCategory="100" app:showAsAction="always" android:actionLayout="@layout/toolbar" android:title="Setting" /> <item android:id="@+id/menu_main_setting2" android:icon="@drawable/ic_settings" android:orderInCategory="200" app:showAsAction="always" android:actionLayout="@layout/toolbar" android:title="Setting" /> </menu>
źródło
W XML dodaj jedną linię w środku
<Toolbar/>
<com.google.android.material.appbar.MaterialToolbar app:menu="@menu/main_menu"/>
W pliku java zamień to:
z tym:
źródło
Możesz nadal korzystać z odpowiedzi udzielonej za pomocą Toolbar.inflateMenu, nawet jeśli używasz setSupportActionBar (pasek narzędzi).
Miałem scenariusz, w którym musiałem przenieść funkcjonalność konfiguracji paska narzędzi do oddzielnej klasy poza działaniem, która sama nie wiedziała o zdarzeniu onCreateOptionsMenu.
Aby to zaimplementować, wszystko, co musiałem zrobić, to poczekać na narysowanie paska narzędzi przed wywołaniem inflateMenu, wykonując następujące czynności:
Może nie być uważany za bardzo czysty, ale nadal wykonuje swoją pracę.
źródło
W moim przypadku używam AppBarLayout z CollapsingToolbarLayout i menu było zawsze przewijane z ekranu, rozwiązałem swój problem, przełączając android: actionLayout w XML menu na identyfikator paska narzędzi. Mam nadzieję, że pomoże to ludziom w takiej samej sytuacji!
activity_main.xml
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:fab="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".activities.MainScreenActivity" android:screenOrientation="portrait"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="300dp" app:elevation="0dp" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/collapsingBar" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_scrollFlags="exitUntilCollapsed|scroll" app:contentScrim="?attr/colorPrimary" app:expandedTitleMarginStart="48dp" app:expandedTitleMarginEnd="48dp" > <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:elevation="0dp" app:popupTheme="@style/AppTheme.PopupOverlay" app:layout_collapseMode="pin"/> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout> </android.support.design.widget.CoordinatorLayout>
main_menu.xml
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/logoutMenu" android:orderInCategory="100" android:title="@string/log_out" app:showAsAction="never" android:actionLayout="@id/toolbar"/> <item android:id="@+id/sortMenu" android:orderInCategory="100" android:title="@string/sort" app:showAsAction="never"/> </menu>
źródło
Prosty fix to chyliło
showAsAction
sięalways
wmenu.xml
w res / menu<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/add_alarm" android:icon="@drawable/ic_action_name" android:orderInCategory="100" android:title="Add" app:showAsAction="always" android:visible="true"/> </menu>
źródło
res / layout / drawer_menu
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/action_drawer" android:title="@string/app_name" android:icon="@drawable/ic_menu_black_24dp" app:showAsAction="always"/> </menu>
toolbar.xml
<com.google.android.material.appbar.AppBarLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> <androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" app:titleTextColor="@android:color/white" app:titleTextAppearance="@style/TextAppearance.Widget.Event.Toolbar.Title"> <TextView android:id="@+id/toolbar_title" android:layout_gravity="center" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="@string/app_name" android:textColor="@android:color/white" style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title" /> </androidx.appcompat.widget.Toolbar>
źródło
Cóż, musisz ustawić pasek akcji wsparcia setSupportActionBar (); i przekaż swoją zmienną, na przykład:
setSupportActionBar(toolbar);
źródło