web-dev-qa-db-ja.com

メニューにトグルボタンを追加して、サービスを停止および開始します

ユーザーがメニューから実装しているサービスを停止および開始できるようにしようとしています。メニューをクリックするとテキストが変更されるため、メニューツールのオプションとして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;
    }
}
7
The Time

上記のように、メニューにトグルボタンを追加することはできません。メニュー項目の_Android:checkable_プロパティを使用して、2つの状態を処理できます。

何かのようなもの:

メニュー

_<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: ここ からコードをコピーしました。

またはクリックイベントでアイテムアイコンを更新するだけで、item.setIcon(yourDrawable));で2つの状態を表示できます。

10
Rami

返信が遅すぎる!

容易いものだ。むしろ、ツールバーにトグルボタンがあります。

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

出力!

enter image description here

かなり大きいですが、サイズを調整できます。

12
Faizan Mubasher

enter image description here

私は答えを投稿するのに非常に長い時間がかかることを知っていますが、それは誰かを助けるかもしれません:)

私はこれに従いました リンク これらの変更の前にアプリがクラッシュしたので、実装されたソリューションのいくつかを更新します

そして、以下が完全な解決策です。1-レイアウトフォルダーの下に新しい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=""
    Android: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;
}
9
Vattic

ウィジェットを<menu>に配置して、それが機能することを期待することはできません。そこに置くことができるのは ここに記載されています そしてそれは基本的にメニュー<item><group>に制限されています。ボタン、トグル、その他のウィジェットはサポートされていません。それで十分な場合は、Android:checkable<item>を使用するか、古風なアプローチを使用して、状態に応じてメニュー項目を変更できます(サービスがオンの場合、項目はturn service offと表示されます。およびその逆)。

2
Marcin Orlowski

メニューリソース 従来のレイアウトとは異なります。単にウィジェットをそれらに追加して、それらが機能することを期待することはできません。メニューリソース内で許可される要素は、<item>または<group>のみです。

メニュー内でカスタムレイアウトを使用することはできません。恐れ入ります。代わりに、メニュー全体をPopupWindowに置き換えて、代わりにそこにレイアウトを指定することもできます。

次の2つの方法を検討することをお勧めします。

  • 従来のメニューエントリをトグルとして使用する、または
  • ToggleButtonを、メニュー内ではなく、アクションバー/ツールバー内に配置します。
0
Paul Lammertsma

メニューxmlで、ウィジェットではなくアイテムを追加します(ボタン/テキストビューなどはありません)。

アイテムのIDとICONを指定し、アクティビティonCreateOptionsMenu()メソッドでそれらを膨らませるだけです。

次に、onOptionsItemSelected(MenuItem item)というメソッドがあります。アイテムIDを期待するIDと照合します。

トグルサービスオプションと等しい場合は、サービスの状態を決定して変更します。トグルボタン機能が必要な場合は、ここでitem.setIcon(drawable)を使用できます。

0
Hughzi