2014-10-21 8 views
64

Я стараюсь использовать android.view.ActionMode с новыми android.support.v7.widget.Toolbar, в дополнение к традиционным android.app.ActionBar. Я могу показать его:Показать ActionMode через панель инструментов

toolbar.startActionMode(callback); 

Проблема заключается в том, что ActionMode отображается над ActionBar, а не над Toolbar. Есть ли способ изменить это?

Я tryied установить следующее в моей теме, но не похоже, чтобы изменить что-либо:

<item name="windowActionModeOverlay">true</item> 
+1

Я думаю, что ActionMode является частью ActionBar, и вы не можете изменить его положение – SpyZip

+0

Это очень плохо. Спасибо за ответ –

+1

Установили ли вы панель инструментов в качестве панели действий? –

ответ

27

Попробуйте это в вашей теме:

<item name="windowActionModeOverlay">true</item> 
+0

Как было сказано в моем вопросе, я уже пробовал это без успеха. Но спасибо! –

+0

Извините, я не понимал, что вы уже пробовали это. Вы уверены, что это не сработает? Меня устраивает. –

+0

У меня была такая же проблема, и это исправляет ее. Благодаря! –

49

Не запускайте его на вашей деятельности , но на панели инструментов. В вас деятельности:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
toolbar.startActionMode(mActionModeCallback) 

и вы должны использовать

<item name="windowActionModeOverlay">true</item> 

в вашей теме, как заявил Андре.

+1

Это работало для меня, потому что у меня также было специальное требование. Вместо реализации «ActionMode.Callback» я хотел реализовать «MultiChoiceModeListener». Проблема с использованием поддержки 'ActionMode' заключается в том, что не существует версии поддержки' MultiChoiceModeListener'. – jwir3

54

Поскольку вы используете Toolbar, я предполагаю, что вы используете AppCompatActivity и заменили встроенный в ActionBar с пользовательских Toolbar с помощью setSupportActionBar(toolbar);

Прежде всего убедитесь, что вы импортируемое правильное пространство имен.

import android.support.v7.view.ActionMode; 

и НЕ

import android.view.ActionMode; 

затем использовать

_actionMode = startSupportActionMode(this); 

и НЕ

_actionMode = startActionMode(this); 
+19

Это плюс настройка 'windowActionModeOverlay', работавшая для меня. – Jimeux

+4

В настоящее время я использую 'AppCompatActivity' и добавление' windowActionModeOverlay' было достаточно для меня. Я попытался использовать import 'android.support.v7.view.ActionMode', но он не работал с' MultiChoiceModeListener', поэтому я в конечном итоге использовал 'android.view.ActionMode'. Вы знаете, есть ли версия поддержки MultiChoiceModeListener? Спасибо – Axel

+0

Есть ли версия поддержки MultiChoiceModeListener? – galaxigirl

1

Это решение, которое я сделал.

В моем методе onCreateActionMode из ActionMode.Callback, я добавляю это:

StandaloneActionMode standaloneActionMode = (StandaloneActionMode) actionMode; 
Field mContextView; 
try { 
    mContextView = StandaloneActionMode.class.getDeclaredField("mContextView"); 
    mContextView.setAccessible(true); 
    View contextView = (View) mContextView.get(standaloneActionMode); 
    MarginLayoutParams params = (MarginLayoutParams) contextView.getLayoutParams(); 
    params.topMargin = mToolbar.getTop(); 
    } catch (NoSuchFieldException e) { 
      e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
    } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
    } 

Это работает для меня.

0

Я пробовал все методы выше, но он все еще не работает. И потом, я попробовал метод ниже:

private class ActionModeCallback implements ActionMode.Callback { 
    @Override 
    public boolean onCreateActionMode(ActionMode actionMode, Menu menu) { 
     actionMode.getMenuInflater().inflate(R.menu.note_find_action, menu); 
     return true; 
    } 

    @Override 
    public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) { 
     ((AppCompatActivity) getActivity()).getSupportActionBar().hide(); 
     return false; 
    } 

    @Override 
    public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) { 
     return false; 
    } 

    @Override 
    public void onDestroyActionMode(ActionMode actionMode) { 
     ((AppCompatActivity) getActivity()).getSupportActionBar().show(); 
    } 
} 

Здесь я использовал режим действий и метод startSupportActionMode библиотеки поддержки. В то же время я также попытался изменить тему данной деятельности. Конечно, он не работает. Итак, если у вас действительно нет лучшего выбора, вы можете попробовать это.

Совсем недавно я обнаружил, что я использовал рамку Colorful для включения нескольких тем своего приложения, это изменит тему в коде. Когда я попытался изменить стиль в этой структуре, он работает.

Надеюсь, что он работает.