2015-07-14 2 views
2

Я пытаюсь включить пользователя для остановки и запускает сервис, который я реализую из меню, где текст будет изменен, когда он нажмет на него, поэтому я хочу добавить 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; 
     } 
    } 
} 

Edit:

@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; 
    } 
} 
+0

Я не думаю, что вы могли бы добавить ToggleButton в меню –

ответ

5

Как уже упоминалось выше, вы не можете добавить кнопку переключения в меню. Вы можете использовать свойство 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));

+0

я попробовал этот код, прежде чем я получил эту ошибку: ' java.lang.NullPointerException: попытка вызвать метод интерфейса «android.view.MenuItem android.view.MenuItem.setChecked (boolean)» в ссылке на нулевой объект –

+0

Проверьте свой «menu.xml», у вас должен быть элемент с " checkable_menu "как id – Rami

+0

Могу ли я использовать в if, если оно было в этом wasy' if (item.isChecked()) {} else {} 'вместо' isChecked =! item.isChecked(); item.setChecked (IsChecked); '? –

1

Вы не можете поместить любой виджет в <menu> и ожидайте его работы. Что вы можете положить там documented here и это в основном ограничено меню <item> и <group>. Нет кнопок, переключателей, флажков и других виджетов.

Что вам нужно сделать в вашем случае - это просто изменить пункт меню в зависимости от состояния (если служба включена, тогда ваш пункт должен читать turn service off и наоборот).

0

Menu resources отличаются от обычных макетов; вы не можете просто добавить в них виджеты и ожидать, что они будут работать. Единственными элементами, разрешенными внутри ресурса меню, являются <item> или <group>.

Использование пользовательского макета внутри меню невозможно, я боюсь. Вместо этого вы можете заменить все меню на PopupWindow и вместо этого предоставить свои макеты.

Вы можете рассмотреть два варианта:

  • Использование обычного пункта меню в качестве тумблера или
  • размещающих ToggleButton непосредственно внутри ActionBar/Панели инструментов, а не в меню.
0

В XML меню добавления элементов не виджеты (нет кнопки/TextViews и т.д.)

Вы просто указать идентификатор и значок для элемента, а затем раздуть их в своей деятельности onCreateOptionsMenu() метод.

, тогда существует метод, называемый onOptionsItemSelected (элемент MenuItem), проверяющий элементы id против ожидаемых ожиданий.

Если его значение равно вашему сервису переключения, определите состояние службы и измените его, если вы хотите иметь функцию кнопки переключения, вы можете использовать item.setIcon (drawable) здесь.

9

Слишком поздно блин ответ!

Это очень просто. Скорее всего, у вас будет кнопка переключения на панели инструментов.

<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

Это довольно большое, но вы можете настроить его размер, очевидно

+1

Это должен быть принятый ответ – Libin

Смежные вопросы