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

Art*_*ans 49 android android-layout

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

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

Eze*_*iel 91

为交换机创建布局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>
Run Code Online (Sandbox Code Playgroud)

然后,在您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>
Run Code Online (Sandbox Code Playgroud)

在你的活动中,mainmenu.xml像往常一样充气

getMenuInflater().inflate(R.menu.mainmenu, menu);
return true;
Run Code Online (Sandbox Code Playgroud)

  • 如果切换不可见,则使用`app`命名空间用于`actionLayout`和`showAsAction` (36认同)
  • 你应该将`android:layout_centerVertical ="true"`添加到`Switch`中,使它与标题具有相同的高度 (11认同)
  • 我正在使用appcompat,我使用了app命名空间for actionLayout和showAsAction,但是我无法处理它对`onOptionsItemSelected`方法的点击?怎么做? (3认同)
  • 嘿,"菜单的自定义布局应始终是RelativeLayout".是否有任何doc状态? (2认同)

小智 36

最后想出了我的问题:对于那些使用新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>
Run Code Online (Sandbox Code Playgroud)

然后在代码中设置布局:

@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;
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么每个人都在RelativeLayout上使用`android:orientation ="horizo​​ntal"? (14认同)

Nei*_* M. 31

如果窗口小部件没有出现在操作栏中,可能是因为您正在使用appCompat作为操作栏.要解决此问题,请在menu.xml中的"showAsAction"和"actionLayout"前面将"android:"切换为"app:"

将项目添加到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>
Run Code Online (Sandbox Code Playgroud)

制作用于"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>
Run Code Online (Sandbox Code Playgroud)

像往常一样,在ActionBarActivity中为菜单充气

   getMenuInflater().inflate(R.menu.mainmenu, menu);
    return true;
Run Code Online (Sandbox Code Playgroud)

这应该使开关出现在您的操作栏中,如果它没有出现.


gpr*_*our 12

想要补充的朋友们,

检查将侦听器更改为同一交换机

科特林

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
}
Run Code Online (Sandbox Code Playgroud)

爪哇

@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;
}
Run Code Online (Sandbox Code Playgroud)

PS 您可以更改对 Switch 或 SwitchCompat 的引用


Fab*_* PH 5

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>
Run Code Online (Sandbox Code Playgroud)

以编程方式对其进行充气:

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);
Run Code Online (Sandbox Code Playgroud)