Как добавить переключатель в панель действий Android?
Я хотел бы добавить кнопочный переключатель, похожий на внешний вид jellybean. (Синий/серый переключатель в верхней части окна)
![enter image description here]()
Документация показывает, как создать там меню или добавить значки, но он не говорит, как добавить пользовательские элементы. например. переключатель.
http://developer.android.com/guide/topics/ui/actionbar.html
Ответы
Ответ 1
Создайте макет для коммутатора switch_layout.xml
. Пользовательские макеты для меню всегда должны быть RelativeLayout
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<Switch
android:id="@+id/switchForActionBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="" />
</RelativeLayout>
Затем в mainmenu.xml
добавьте элемент следующим образом
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/myswitch"
android:title=""
android:showAsAction="always"
android:actionLayout="@layout/switch_layout"
/>
</menu>
И в своей деятельности надуйте mainmenu.xml
, как вы всегда делаете
getMenuInflater().inflate(R.menu.mainmenu, menu);
return true;
Ответ 2
Наконец-то выяснилось, что моя проблема: для тех, кто использует новый AppCompat, вы должны использовать android.support.v7.widget.SwitchCompat
вместо Switch
в макете коммутатора... в противном случае он не будет отображаться на ActionBar
(предполагается вы также используете AppCompat ActionBar), ну, атрибут actionLayout не работает, он должен быть установлен в коде.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/switchView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<android.support.v7.widget.SwitchCompat
android:id="@+id/switchForActionBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="" />
</RelativeLayout>
Затем установите макет в код:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
MenuItem item = menu.findItem(R.id.on_off_switch);
item.setActionView(R.layout.on_off_switch);
return true;
}
Ответ 3
Если виджет не отображается в панели действий, это, вероятно, потому, что вы используете appCompat для своей панели действий. Чтобы решить этот переключатель "android:" на "приложение:" перед "showAsAction" и "actionLayout" в вашем меню. Xml
Добавить элемент в xml, с приложением: вместо android:
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/myswitch"
android:title=""
app:showAsAction="always"
app:actionLayout="@layout/switch_layout"
/>
</menu>
Сделайте макет, который вы используете для своего приложения: actionLayout
switch_layout
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<Switch
android:id="@+id/switchAB"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
/>
</RelativeLayout>
Наполните меню в своей ActionBarActivity, как обычно,
getMenuInflater().inflate(R.menu.mainmenu, menu);
return true;
Это должно заставить коммутатор отображаться в панели действий, если он не появился.
Ответ 4
Решение, данное Ezequiel, является удивительным и работает. Здесь идет другой подход:
Определите свой собственный макет:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" >
<Switch
android:id="@+id/actionbar_switch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="" />
</RelativeLayout>
Наполните его программно:
ActionBar actionBar = getSupportActionBar();
actionBar.setCustomView(R.layout.actionbar_top);
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_CUSTOM);
...
Switch button = (Switch) findViewById(R.id.actionbar_switch);