如何添加到Android操作栏的开关?

时间:2012-08-24 09:51:29

标签: android android-layout

我想添加一个类似于jellybean原生外观的按钮开关。 (视图顶部的蓝色/灰色开关) enter image description here

文档显示了如何在那里创建菜单或添加图标,但它没有说明如何添加自定义元素。例如。一个开关。 http://developer.android.com/guide/topics/ui/actionbar.html

5 个答案:

答案 0 :(得分:89)

为交换机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;

答案 1 :(得分:35)

最后想出了我的问题:对于那些使用新AppCompat的人,你应该在交换机布局上使用android.support.v7.widget.SwitchCompat而不是Switch ...否则,它不会显示在{ {1}}(假设你也在使用AppCompat ActionBar),而且actionLayout属性不起作用,必须在代码中设置。

ActionBar

然后在代码中设置布局:

<?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>

答案 2 :(得分:29)

如果窗口小部件没有出现在操作栏中,可能是因为您正在使用appCompat作为操作栏。解决这个问题&#34; android:&#34;在&#34; showAsAction&#34;前面的&#34; app:&#34; 和&#34; actionLayout&#34;在你的menu.xml中

将项目添加到xml,使用app:代替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>

制作适用于&#34; app的布局:actionLayout&#34;
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;

如果没有出现,这应该会使切换出现在操作栏中。

答案 3 :(得分: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);

答案 4 :(得分:2)

对于那些想要添加的人,

已将更改侦听器选中到同一交换机

科特琳

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.menu_main, menu)
    val item = menu!!.findItem(R.id.my_switch_item)
    item.setActionView(R.layout.switch_layout)

    val mySwitch = item.actionView.findViewById(R.id.switch_id)
    mySwitch.setOnCheckedChangeListener(object : CompoundButton.OnCheckedChangeListener{
        override fun onCheckedChanged(p0: CompoundButton?, isChecked: Boolean) {
            // do what you want with isChecked
        }
    })

    return true
}

Java

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);
    MenuItem item = menu.findItem(R.id.my_switch_item);
    item.setActionView(R.layout.switch_layout);

    Switch mySwitch = item.getActionView().findViewById(R.id.switch_id);
    mySwitch.setOnCheckedChangeListener(new OnCheckedChangeListener() {
         @Override
         public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                  // do something based on isChecked
         }
    });
    return true;
}
  

P.S。您可以更改对Switch或SwitchCompat的引用