Можно ли реализовать переключатель в пункте меню действий с помощью Actionbar sherllock в android

У меня есть приложение, в котором есть кнопка переключения в пункте меню действий, хотя я использую Actionbar Sherllock, я не знаю, как разместить кнопку переключения в пункте меню действий. Я не хочу размещать пользовательский макет в панели действий, но я хочу разместить его в качестве элемента меню. Если кто-нибудь найдет решение, Пожалуйста, помогите мне.

Цель, если я изменю состояние кнопки переключения, он будет сортировать человека на основе алфавитов и снова в дату рождения.

Заранее спасибо!

4 ответа

  1. Просто добавьте его как обычную кнопку Меню, проверьте его состояние с помощью логической переменной, и вы можете изменить значок и заголовок при изменении sortmode

    boolean birthSort=false;
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.menu_toggle:
    
            if(birthSort){
                //change your view and sort it by Alphabet
                item.setIcon(icon1)
                item.setTitle(title1)
                birthSort=false;
            }else{
                //change your view and sort it by Date of Birth
                item.setIcon(icon2)
                item.setTitle(title2)
                birthSort=true;
            }
            return true;
    
    
    
        }
        return super.onOptionsItemSelected(item);
    
    
    }
    

    Не забудьте добавить его в xml, как и любую другую кнопку меню и настроитьandroid:showAsAction, если вы хотите, чтобы показать его в переполнении или за его пределами.

    <menu >
    
    <item android_id="@+id/menu_toogle"
        android_showAsAction="ifRoom"
        android_title="Share"
         />
    </menu>
    
  2. Другой подход заключается в использовании пользовательского макета для панели действий:

    В основном вы определяете макет, содержащий ваш переключатель:

    <RelativeLayout 
      android_layout_width="fill_parent"
      android_layout_height="wrap_content">
      <ToggleButton
        android_id="@+id/actionbar_service_toggle"
        android_layout_width="wrap_content"
        android_layout_height="wrap_content"
        android_textOn="Logging On"
        android_textOff="Logging Off" />
    </RelativeLayout>
    

    Альтернатива 1:
    Затем в вашем действии или контейнере фрагментов вы делаете:

    ActionBar actionBar = getSupportActionBar();
    actionBar.setCustomView(R.layout.actionbar_top);
    actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_CUSTOM);
    ...
    ToggleButton button = (ToggleButton) findViewById(R.id.actionbar_service_toggle);
    

    Обратите внимание, что у вас есть реальный ToggleButton, и вы обрабатываете его в коде как реальный объект ToggleButton, который имеет много преимуществ по сравнению с тем, что вы повторно реализуете свой собственный ToggleButton (тема, надежность, иерархия представлений, встроенная поддержка…).

    Исходный код здесь .


    Альтернатива 2:
    Другой способ сделать это-внедрить пользовательский вид в обычный вид меню:

    <menu  >
        <item
            android_id="@+id/myswitch"
            android_title=""
            android_showAsAction="always"
            android_actionLayout="@layout/actionbar_service_toggle" />   
    </menu>
    
  3. Если как я actionLayout не работает для вас, попробуйте app:actionLayout="@layout/actionbar_service_toggle"вместо android:actionLayout="@layout/actionbar_service_toggle"того, а также app:showAsAction="always"вместо android:showAsAction="always"
    Это потому, что если вы используете appCompat пространство имен android не будет использоваться.

    Итак, вот окончательная версия:

    <RelativeLayout 
      android_layout_width="fill_parent"
      android_layout_height="wrap_content">
      <ToggleButton
        android_id="@+id/actionbar_service_toggle"
        android_layout_width="wrap_content"
        android_layout_height="wrap_content"
        android_textOn="Logging On"
        android_textOff="Logging Off" />
    </RelativeLayout>
    

    и

    <?xml version="1.0" encoding="utf-8"?>
    <menu 
        >
        <item
            android_id="@+id/myswitch"
            android_title=""
            app_showAsAction="always"
            app_actionLayout="@layout/actionbar_service_toggle" />   
    </menu>
    
  4. создать xml-файл в меню:

    меню.XML

     <menu    tools_context="si.ziga.switchinsideab.MainActivity">
    <item android_id="@+id/switchId" android_title="" android_showasaction="always" android_actionlayout="@layout/switch_layout">
       <item android_id="@+id/action_settings" android_orderincategory="100" android_title="@string/action_settings" app_showasaction="never">
    </item></item></menu>
    

    А затем перейдите к папке макета создать новый xml-файл
    и назовите его switch_layout.XML
    Вот код:
    switch_layout.XML

    <!--?xml version="1.0" encoding="utf-8"?-->
    <relativelayout  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">
    </switch></relativelayout>
    

    В классе MainActivity скопируйте и вставьте этот код:
    MainActivity.Ява

     @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu, menu);
    
    switchAB = (Switch)menu.findItem(R.id.switchId)
    .getActionView().findViewById(R.id.switchAB);7
    

    Или пройдите по этой ссылке