ユーザーがメニューから実装しているサービスを停止および開始できるようにしようとしています。メニューをクリックするとテキストが変更されるため、メニューツールのオプションとして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: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つの状態を表示できます。
返信が遅すぎる!
容易いものだ。むしろ、ツールバーにトグルボタンがあります。
<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
}
});
出力!
かなり大きいですが、サイズを調整できます。
私は答えを投稿するのに非常に長い時間がかかることを知っていますが、それは誰かを助けるかもしれません:)
私はこれに従いました リンク これらの変更の前にアプリがクラッシュしたので、実装されたソリューションのいくつかを更新します
そして、以下が完全な解決策です。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;
}
ウィジェットを<menu>
に配置して、それが機能することを期待することはできません。そこに置くことができるのは ここに記載されています そしてそれは基本的にメニュー<item>
と<group>
に制限されています。ボタン、トグル、その他のウィジェットはサポートされていません。それで十分な場合は、Android:checkable
で<item>
を使用するか、古風なアプローチを使用して、状態に応じてメニュー項目を変更できます(サービスがオンの場合、項目はturn service off
と表示されます。およびその逆)。
メニューリソース 従来のレイアウトとは異なります。単にウィジェットをそれらに追加して、それらが機能することを期待することはできません。メニューリソース内で許可される要素は、<item>
または<group>
のみです。
メニュー内でカスタムレイアウトを使用することはできません。恐れ入ります。代わりに、メニュー全体をPopupWindowに置き換えて、代わりにそこにレイアウトを指定することもできます。
次の2つの方法を検討することをお勧めします。
メニューxmlで、ウィジェットではなくアイテムを追加します(ボタン/テキストビューなどはありません)。
アイテムのIDとICONを指定し、アクティビティonCreateOptionsMenu()メソッドでそれらを膨らませるだけです。
次に、onOptionsItemSelected(MenuItem item)というメソッドがあります。アイテムIDを期待するIDと照合します。
トグルサービスオプションと等しい場合は、サービスの状態を決定して変更します。トグルボタン機能が必要な場合は、ここでitem.setIcon(drawable)を使用できます。