工具栏顶部的上下文叠加层

Contextual Overlay stacking on top of toolbar

我已经阅读了关于这个问题的所有答案,但似乎仍然无法让它发挥作用。当我调用 startSupportActionMode 时,操作模式菜单堆叠在工具栏顶部而不是替换它。此图片来自遇到相同问题的另一位用户。

大多数其他问题已通过在样式中使用 windowActionModeOverlay 得到解决。这似乎对我不起作用。我也确定我正在导入校正操作模式。

(import android.support.v7.view.ActionMode;
)

我的情况有点不同。我的主activity是一个AppCompatActivity。我根据导航抽屉所做的选择加载不同的片段。操作栏根据所选的导航项更改。

在我切换到 appCompat-v7 之前,这段代码都有效。我正在尝试转换为新的 material 设计,因此我将基本操作栏替换为工具栏。以下是一些代码片段:

清单:

    <application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"
    android:name="com.acme.common.MINApplication"
    android:largeHeap="true">

    <activity android:name="com.acme.common.MINMainActivity"
              android:theme="@style/AppTheme"
              android:configChanges="orientation|screenSize|keyboardHidden" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

样式:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Main theme colors -->
    <!--   your app branding color for the app bar -->
    <item name="android:colorPrimary">@color/ColorPrimary</item>
    <!-- Support library compatibility -->
    <item name="colorPrimary">@color/ColorPrimary</item>

    <!--   darker variant for the status bar and contextual app bars -->
    <item name="android:colorPrimaryDark">@color/ColorPrimaryDark</item>
    <!-- Support library compatibility -->
    <item name="colorPrimaryDark">@color/ColorPrimaryDark</item>

    <!--   theme UI controls like checkboxes and text fields -->
    <item name="android:statusBarColor">@android:color/transparent</item>

    <item name="windowActionModeOverlay">true</item>
    <item name="android:windowActionModeOverlay">true</item>
</style>

主要Activity:

 public class MINMainActivity extends AppCompatActivity 
 {
private final String TAG = ((Object) this).getClass().getSimpleName();

private View mMainView;

// New Toolbar and Navigation View
public Toolbar toolbar;
public RecyclerView recyclerView;
private MINPageAdapter adapter;
private RecyclerView.LayoutManager layoutManager;
public DrawerLayout drawerLayout;
public android.support.v7.app.ActionBarDrawerToggle drawerToggle;

volatile public boolean isDrawerOpen = false;
private Menu mMenu;


@Override
public void onCreate(Bundle savedInstanceState)
{
    supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS | Window.FEATURE_ACTION_BAR_OVERLAY);

    super.onCreate(savedInstanceState);

    // Inflate main view
    mMainView = getLayoutInflater().inflate(R.layout.material_design_drawer_layout, null);

    setContentView(mMainView);

    sharedInstance = this;

    // Setup New Toolbar implementation
    setupToolbar();

    // Setup Recycler Adapter
    setupAdapter();

    // Setup Navigation View
    initNavigationDrawer();

    // Show startup screen/fragment
    showStartupScreen();

    // Color components based on json settings
    setCustomAttributes();

  init();
}

片段:

 public class MINPageTypeGridFragment extends Fragment 
 {
 @Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    setRetainInstance(true);
    setHasOptionsMenu(true);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    // Inflate view
    gridView = (StickyGridHeadersGridView)inflater.inflate(R.layout.page_gridview_fragment, container, false);

    // Set up specific controls/views
    initializeGridView(inflater, container);

    ...

    return gridView;
}

@Override
public void onResume()
{
    ActionBar actionBar = MINMainActivity.getSharedInstance().getSupportActionBar();
    if(actionBar != null)
    {
        actionBar.show();
        actionBar.setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP |
                                    ActionBar.DISPLAY_SHOW_HOME |
                                    ActionBar.DISPLAY_USE_LOGO |
                                    ActionBar.DISPLAY_SHOW_TITLE);
        actionBar.setTitle(pageDefinition.pageName);
    }

    ...

    super.onResume();
}


@Override
public boolean onOptionsItemSelected(MenuItem item)
{
    int count = 0;

    ...
                freezeGridView();
                mActionMode = MINMainActivity.getSharedInstance().startSupportActionMode(mActionModeCallback);
    ...
    return super.onOptionsItemSelected(item);
}


public ActionMode.Callback mActionModeCallback = new ActionMode.Callback()
{
    @Override
    public boolean onCreateActionMode(ActionMode actionMode, Menu menu)
    {
        MenuItem shareMenuItem;

        ...
                actionMode.getMenuInflater().inflate(R.menu.gridview_edit_menu, menu);
                shareMenuItem = menu.findItem(R.id.MenuItemShare);
                mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareMenuItem);
                if(mShareActionProvider != null)
                {
                    mShareActionProvider.setShareIntent(Share(null));
                    mShareActionProvider.setOnShareTargetSelectedListener(new ShareActionProvider.OnShareTargetSelectedListener()
                    {
                        @Override
                        public boolean onShareTargetSelected(ShareActionProvider shareActionProvider, Intent intent)
                        {
                            if(mActionMode != null)
                            {
                                currentMode = MODE_STANDARD;
                                clearSelectedItems();
                                mActionMode.finish();
                                mActionMode = null;
                            }
                            return false;
                        }
                    });
        ...
        return true;
    }

    @Override
    public boolean onPrepareActionMode(ActionMode actionMode, Menu menu)
    {
        return false;
    }

    @Override
    public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem)
    {
        switch(menuItem.getItemId())
        {
            case R.id.MenuItemEdit:
                launchAlbumItemDetails(MINPageTypeGridFragment.this, currentAlbumItem, pageDefinition.pageConfigFileName);
                return true;
            case R.id.MenuItemDelete:
                deleteItem(MINPageTypeGridFragment.this, currentAlbum, currentAlbumItem);
                return true;
            default:
                return false;
        }
    }

    @Override
    public void onDestroyActionMode(ActionMode actionMode)
    {
        clearSelectedItems();
    }

}

我确定我遗漏了一些明显的东西,但我没有想法。

确保将 工具栏 设置为当前操作栏(也许您的方法 setupToolbar 已经这样做了):

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);    
setSupportActionBar(toolbar);

之后,更改代码并直接从工具栏引用启动操作模式:

toolbar.startActionMode(mActionModeCallback)

如果这能解决您的问题,请告诉我们。

您应该删除 'duplicate' 定义:android:windowActionModeOverlay -> windowActionModeOverlay; android:colorPrimary -> colorPrimary 等等。这是一个应该有效的示例:

<style name="AppBaseTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="windowActionModeOverlay">true</item>
    <item name="colorControlNormal">@color/appColorControlNormal</item>
    <item name="colorControlHighlight">@color/appColorControlHighlight</item>
    <item name="colorControlActivated">@color/appColorControlActivated</item>
    <item name="colorPrimary">@color/appColorPrimary</item>
    <item name="colorPrimaryDark">@color/appColorPrimaryDark</item>
    <item name="colorAccent">@color/appColorAccent</item>
</style>