获取菜单组为视图

时间:2018-12-18 22:19:21

标签: java android xml android-layout

我正在使用MaterialShowcaseView向用户提供我的应用程序概述。为展示设置目标,它必须是View。下面是一个序列示例:

String SHOWCASE_ID = getString(R.string.showcase_id);

ShowcaseConfig config = new ShowcaseConfig();
config.setDelay(500); // half second between each showcase view

MaterialShowcaseSequence sequence = new MaterialShowcaseSequence(this, SHOWCASE_ID);

sequence.setConfig(config);

...

sequence.addSequenceItem(
        new MaterialShowcaseView.Builder(this)
                .setTarget(findViewById(R.id.navigation_header))
                .setDismissText(getString("GOT IT"))
                .setTitleText(getString(R.string.onboarding_navigation_header_title))
                .setContentText(getString(R.string.onboarding_navigation_header_content))
                .withRectangleShape(false)
                .build());
 ...

sequence.start();

在此示例中,我定位到以下NavigationView的导航标题:

<android.support.design.widget.NavigationView
    android:id="@+id/nav_view"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:fitsSystemWindows="true"
    app:menu="@menu/main_navigation"
    app:headerLayout="@layout/nav_header"/>

如何将上面的菜单中的菜单作为View获取,以便我可以将其传递到setTarget()中进行展示?

我尝试仅使用NavigationView,但这既针对标头布局又针对菜单。我也尝试过按ID(findViewById(R.id.menu_group_id))获取菜单组,但我不认为菜单组从技术上讲是View。我可以通过NavigationView.getMenu()获取菜单,但是返回一个Menu对象。有什么想法吗?

编辑:整个菜单需要确定目标。附带说明,NavigationView存在于DrawerLayout中(如果发生任何更改)。

2 个答案:

答案 0 :(得分:1)

没有直接方法可以在NavigationView中获取菜单组的视图参考。您可以remove或在运行时将NavigationView作为目标隐藏标题视图,add或在将其作为其他目标时再次显示标题视图。

您可以使用getheaderview来获取标题并调用:

your_header.setVisibility(View.GONE)    //hide
your_header.setVisibility(View.VISIBLE) //show

答案 1 :(得分:0)

您可以将菜单项用作action views来访问菜单项。像这样在您的actionViewClass中设置menu.xml

<item
    ...
    app:actionViewClass="android.support.design.widget.NavigationView"
/>

然后在您的活动中:

public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);

    ...

    sequence.addSequenceItem(
            new MaterialShowcaseView.Builder(this)
                    .setTarget(findViewById(R.id.navigation_header))
                    .setDismissText(getString("GOT IT"))
                    .setTitleText(getString(R.string.onboarding_navigation_header_title))
                    .setContentText(getString(R.string.onboarding_navigation_header_content))
                    .withRectangleShape(false)
                    .build());
     ...

    return true;
}