我想添加一个类似于jellybean原生外观的按钮开关。 (视图顶部的蓝色/灰色开关)
文档显示了如何在那里创建菜单或添加图标,但它没有说明如何添加自定义元素。例如。一个开关。 http://developer.android.com/guide/topics/ui/actionbar.html
答案 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的引用