如何添加一个开关到android动作栏?

我想添加一个类似于jellybean原生外观的button开关。 (视图顶部的蓝色/灰色开关) 在这里输入图像描述

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

switch_layout.xml创build一个布局。 自定义菜单布局应始终为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; 

最后想出了我的问题:对于那些使用新的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; } 

如果小部件没有出现在操作栏中,可能是因为您正在使用appCompat作为您的操作栏。 要在menu.xml中的“showAsAction”和“actionLayout”之前解决这个开关“android:”到“app:”

添加项目到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> 

为你的“app: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; 

这应该使交换机出现在你的行动栏,如果没有出现。

由Ezequiel给出的解决scheme是真棒和工作。 这里有另一种方法:

定义您的自定义布局:

 <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);