Подтвердить что ты не робот

Как добавить переключатель в панель действий Android?

Я хотел бы добавить кнопочный переключатель, похожий на внешний вид jellybean. (Синий/серый переключатель в верхней части окна) enter image description here

Документация показывает, как создать там меню или добавить значки, но он не говорит, как добавить пользовательские элементы. например. переключатель. http://developer.android.com/guide/topics/ui/actionbar.html

4b9b3361

Ответ 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);