【问题标题】:Add toggle button to the menu to stop and start service在菜单中添加切换按钮以停止和启动服务
【发布时间】:2015-07-14 07:53:36
【问题描述】:

我试图让用户停止和启动我正在从菜单实现的服务,当他点击它时,文本将被更改,所以我想在菜单工具中添加 ToggleButton 作为选项,但什么都没有现在正在我的案例中展示。我该如何解决?

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <ToggleButton
        android:id="@+id/toggle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textOff="Off"
        android:textOn="On" />
</menu>

MainActivity:

public class MainActivity extends ActionBarActivity {
    ToggleButton tButton;
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main_menu, menu);

        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.toggle:

                tButton = (ToggleButton) findViewById(R.id.toggle);
                tButton.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        if (((ToggleButton) v).isChecked()) {
                            Intent i = new Intent(MainActivity.this,
                                                  TrackingService.class);
                            startService(i);
                            System.out.println("test is checked, start service");

                        } else {
                            // Stop the service when the Menu button clicks.
                            Intent i = new Intent(MainActivity.this,
                                                  TrackingService.class);
                            stopService(i);
                            System.out.println("test is NOT checked, stop service");

                        }

                    }
                });

                return true;

            default:
                return false;
        }
    }
}

编辑:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.checkable_menu:
        if (isChecked = !item.isChecked()) {
            item.setChecked(isChecked);

            Intent i = new Intent(this, TrackingService.class);
            startService(i);
            System.out.println("test if onOptionsItemSelected");
        } else {
            Intent i = new Intent(this, TrackingService.class);
            stopService(i);
            System.out.println("test else onOptionsItemSelected");

        }
        return true;

    default:
        System.out
                .println("test default onOptionsItemSelected was invoked.");
        return false;
    }
}

【问题讨论】:

  • 我认为你不能在菜单中添加切换按钮

标签: android android-layout android-menu


【解决方案1】:

这很容易。相反,您将在工具栏上拥有切换按钮。

<item
    android:id="@+id/show_secure"
    android:enabled="true"
    android:title=""
    android:visible="true"
    app:actionLayout="@layout/show_protected_switch"
    app:showAsAction="ifRoom" />

这是您的 show_protected_switch.xml 布局。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<ToggleButton
    android:id="@+id/switch_show_protected"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/switch_ptotected_btn_selector"
    android:textOff=""
    android:textOn=""/>
 </RelativeLayout>

在代码中:

 ToggleButton mSwitchShowSecure;
 mSwitchShowSecure = (ToggleButton) menu.findItem(R.id.show_secure).getActionView().findViewById(R.id.switch_show_protected);
        mSwitchShowSecure.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                if(b){
                    //Your code when checked

                } else {
                    //Your code when unchecked
                }Y
            }
        });

输出!

它相当大,但你可以调整它的大小,显然

【讨论】:

  • OP 不是打算在下拉菜单中放置一个拨动开关吗?
【解决方案2】:

我知道发布答案需要很长时间,但它可能会对某人有所帮助:)

我关注了这个link 并更新了一些已实施的解决方案,因为在这些修改之前应用程序崩溃了

以下是完整的解决方案: 1- 在 layout 文件夹下创建一个新的 xml 文件并将其命名为 switch_layout.xml 并放入以下内容:

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

2- 在菜单文件夹下的 main.xml 文件中添加以下菜单项:

<item
    android:id="@+id/switchId"
    android:title=""
    app:actionLayout="@layout/switch_layout"
    app:showAsAction="always" />

3- 转到您的活动,下面是 onCreateOptionsMenu 方法的完整实现:​​

 @Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    MenuItem item = (MenuItem) menu.findItem(R.id.switchId);
    item.setActionView(R.layout.switch_layout);
    Switch switchAB = item
            .getActionView().findViewById(R.id.switchAB);
    switchAB.setChecked(false);

    switchAB.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView,
                                     boolean isChecked) {
            if (isChecked) {
                Toast.makeText(getApplication(), "ON", Toast.LENGTH_SHORT)
                        .show();
            } else {
                Toast.makeText(getApplication(), "OFF", Toast.LENGTH_SHORT)
                        .show();
            }
        }
    });
    return true;
}

【讨论】:

    【解决方案3】:

    如上所述,您不能在菜单中添加切换按钮。您可以使用菜单项中的android:checkable 属性来处理这两种状态。

    类似:

    菜单

    <item
        android:id="@+id/checkable_menu"
        android:checkable="true"
        android:title="@string/checkable" />
    

    活动

    private boolean isChecked = false;
    
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        MenuItem checkable = menu.findItem(R.id.checkable_menu);
        checkable.setChecked(isChecked);
        return true;
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.checkable_menu:
                isChecked = !item.isChecked();
                item.setChecked(isChecked);
                return true;
            default:
                return false;
        }
    }
    

    PS:从here复制代码。

    或者您可以在点击事件上更新您的项目图标以显示item.setIcon(yourDrawable));的两种状态

    【讨论】:

    • 我之前试过这个代码,我得到了这个错误:java.lang.NullPointerException: Attempt to invoke interface method 'android.view.MenuItem android.view.MenuItem.setChecked(boolean)' on a null object reference
    • 检查你的“menu.xml”,你必须有一个id为“checkable_menu”的项目
    • 我可以在 if 条件中使用它吗?if (item.isChecked()) {}else{} 而不是 isChecked = !item.isChecked(); item.setChecked(isChecked);
    • 是的,但不要忘记在 IF 和 ELSE 中更新 isChecked 变量和 item.setChecked(newValue);
    • 请你看看我的编辑代码。如何将选中的复选框设置为默认值?
    【解决方案4】:

    您不能将任何小部件放入&lt;menu&gt; 并期望它能够工作。你可以放在那里的是documented here,它基本上仅限于菜单&lt;item&gt;&lt;group&gt;。不支持按钮、切换和其他小部件。如果这样就足够了,您可以在&lt;item&gt; 上使用android:checkable 或使用old-skool 方法并根据状态更改菜单项(如果服务已开启,那么您的项目应为turn service off,反之亦然)。

    【讨论】:

      【解决方案5】:

      在菜单 xml 中添加项目而不是小部件(没有按钮/文本视图等)

      您只需为项目指定一个 ID 和一个 ICON,然后在您的活动 onCreateOptionsMenu() 方法中对它们进行膨胀。

      然后有一个名为 onOptionsItemSelected(MenuItem item) 的方法检查项目 ID 与您期望的 ID。

      如果它等于您的切换服务选项确定服务状态并更改,如果您想要切换按钮功能,您可以在此处使用 item.setIcon(drawable)。

      【讨论】:

        【解决方案6】:

        Menu resources 与传统布局不同;您不能简单地将小部件添加到其中并期望它们工作。菜单资源中允许的唯一元素是 &lt;item&gt;&lt;group&gt;

        恐怕无法在菜单中使用自定义布局。相反,您可能想用 PopupWindow 替换整个菜单,并在那里提供您的布局。

        您可能需要考虑两种选择:

        • 使用传统的菜单项作为切换,或
        • 将 ToggleButton 直接放在操作栏/工具栏内,而不是菜单内。

        【讨论】:

          猜你喜欢
          • 2019-03-17
          • 2016-02-10
          • 2015-02-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多