it-swarm.com.ru

Отображение ActionMode на панели инструментов

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

toolbar.startActionMode(callback);

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

Я попытался установить следующее в моей теме, но, похоже, это ничего не меняет:

<item name="windowActionModeOverlay">true</item>
76
Gaëtan

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

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

import Android.support.v7.view.ActionMode;

и не

import Android.view.ActionMode;

затем используйте

_actionMode = startSupportActionMode(this);

и не

_actionMode = startActionMode(this);
70
Kuffs

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

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

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

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

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

59
Frank

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

<item name="windowActionModeOverlay">true</item>
35
André Restivo

найдите свой AndroidManifest.xml, затем добавьте следующий код в свое приложение или тему «Активность».

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

так как:

<style name="WorkTimeListTheme" parent="AppTheme.NoActionBar">
        <item name="windowActionModeOverlay">true</item>
        <item name="actionModeBackground">@color/theme_primary</item>
    </style>
2
zhangjin

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

В моем 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();
  }

Меня устраивает.

1
Avery

Я думаю, что одна вещь, которую люди не дают понять, что линия

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

находится в базовой теме, т.е. в AppTheme, а не в AppTheme.NoActionBar

<resources>

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="windowActionModeOverlay">true</item>
</style>

<style name="transparent" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="Android:windowBackground">@Android:color/transparent</item>
    <item name="Android:windowIsTranslucent">true</item>
</style>


<style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />

<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />

1
Lefty9910

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

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

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

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

0
Shouheng Wang