我想尝试使用android.view.ActionMode
和新的android.support.v7.widget.Toolbar
,以及传统的android.app.ActionBar
。我可以用以下方式显示它:
toolbar.startActionMode(callback);
问题是ActionMode
显示在ActionBar
上,而不是在Toolbar
上。有办法改变吗?
我试图在我的主题中设置以下内容,但它似乎没有改变任何东西:
<item name="windowActionModeOverlay">true</item>
由于您使用的是
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);
不要在您的活动上启动它,而是在工具栏上启动它。在你的活动中:
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.startActionMode(mActionModeCallback)
你必须使用
<item name="windowActionModeOverlay">true</item>
在你的主题中,安德烈说。
在你的主题中尝试这个:
<item name="windowActionModeOverlay">true</item>
我认为人们没有说清楚的一点就是这条线
<item name="windowActionModeOverlay">true</item>
被放置在Base主题中,即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" />
找到您的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>
这是我的解决方案。
在我的ActionMode.Callback的onCreateActionMode方法中,我添加了这个:
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();
}
这个对我有用。
我已经尝试了上面的所有方法,但它仍然无法正常工作。然后,我尝试了以下方法:
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方法的支持库。与此同时,我也尝试修改给定活动的主题。当然,它不起作用。所以,如果你真的没有更好的选择,你可以试试这个。
就在最近,我发现我使用了彩色框架来启用我的应用程序的多个主题,这将改变代码中的主题。当我尝试修改此框架中的样式时,它可以正常工作。
希望它有效。