Показать ActionMode через панель инструментов
Я пытаюсь использовать android.view.ActionMode
с новым android.support.v7.widget.Toolbar
, в дополнение к традиционному android.app.ActionBar
. Я могу отобразить его с помощью:
toolbar.startActionMode(callback);
Проблема в том, что ActionMode
отображается над ActionBar
, а не над Toolbar
. Есть ли способ изменить это?
Я попытался установить следующее в моей теме, но это ничего не меняет:
<item name="windowActionModeOverlay">true</item>
Ответы
Ответ 1
Поскольку вы используете Toolbar
, я также предполагаю, что вы используете AppCompatActivity
и заменили встроенный ActionBar
на свою собственную Toolbar
используя setSupportActionBar(toolbar);
Прежде всего убедитесь, что вы импортируете правильное пространство имен:
import androidx.appcompat.view.ActionMode;
// Or
import android.support.v7.view.ActionMode;
и не
import android.view.ActionMode;
затем используйте
_actionMode = startSupportActionMode(this);
и не
_actionMode = startActionMode(this);
Ответ 2
Не запускайте его в своей деятельности, а на панели инструментов. В вашей деятельности:
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.startActionMode(mActionModeCallback)
и вы должны использовать
<item name="windowActionModeOverlay">true</item>
в вашей теме, как указано Андре.
Ответ 3
Попробуйте это в своей теме:
<item name="windowActionModeOverlay">true</item>
Ответ 4
Я думаю, что одна вещь, которую люди не дают понять, что линия
<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" />
Ответ 5
найдите свой 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>
Ответ 6
Это решение, которое я сделал.
В моем 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();
}
Это работает для меня.
Ответ 7
Я перепробовал все методы, описанные выше, но он все еще не работает. И тогда я попробовал следующий метод:
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. В то же время я также пытался изменить тему данной деятельности. Конечно, это не работает. Так что, если у вас действительно нет лучшего выбора, вы можете попробовать этот.
Совсем недавно я обнаружил, что использовал красочную рамку, чтобы включить несколько тем моего приложения, это изменит тему в коде. Когда я попытался изменить стиль в этой структуре, это работает.
Надеюсь, что это работает.