【问题标题】:ActionView set to an item in support NavigationView not showingActionView 设置为支持 NavigationView 中的项目不显示
【发布时间】:2016-01-27 21:03:59
【问题描述】:

我在导航抽屉中使用支持 NavigationView 来显示项目菜单。

<android.support.design.widget.NavigationView
    android:id="@+id/drawer_navigation"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:background="@drawable/drawable_background"
    app:headerLayout="@layout/drawer_header"
    app:itemBackground="@drawable/drawer_item_background"
    app:itemIconTint="@color/drawer_item"
    app:itemTextColor="@color/drawer_item"
    app:menu="@menu/drawer"
    app:theme="@style/Text.DrawerItem"/>

我想在菜单项旁边显示连接请求计数器。

我尝试在 XML 菜单定义中像这样设置actionLayout

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">

  <group android:checkableBehavior="single">
    ...
    <item
        android:id="@+id/navigation_requests"
        android:icon="@drawable/ic_swap_horiz_24dp"
        android:title="@string/connect_menu_connection_requests"
        app:actionLayout="@layout/connection_request_counter"
        app:showAsAction="always"/>
    ...
  </group>
</menu>

ActionView 的布局connection_request_counter.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="wrap_content"
      android:layout_height="match_parent"
      android:gravity="center_vertical"
      android:textColor="@color/brand_blue"
      android:text="5"/>

但此时我看不到项目旁边的数字 5。

我也尝试过以编程方式设置 ActionLayout:

MenuItemCompat.setActionView(mMenu.findItem(R.id.navigation_requests), R.layout.connection_request_counter);

但还是没有运气。

我可以像这样获得对 TextView 的引用

final TextView connectionRequestCounterView
            = (TextView) MenuItemCompat.getActionView(mMenu.findItem(R.id.navigation_requests));

它实际上返回了一个 TextView 实例,但即使我为它设置了一个文本,我也看不到布局中的任何内容。这可能与我正在设计菜单项的样式有关吗? (我设置了菜单项的文本颜色、色调和背景)

这是我的风格:

<style name="Text.DrawerItem">
    <item name="android:textColor">@color/text_color_dark_grey</item>
    <item name="android:textSize">@dimen/text_size_default</item>
    <item name="android:clickable">false</item>
    <item name="android:textColorLink">@color/text_color_dark_grey</item>
    <item name="fontPath">@string/font_aller_light</item>
    <!--<item name="android:background">@color/background_activity_default</item>-->
    <!--<item name="background">@color/background_activity_default</item>-->
</style>

drawer_item_background.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <!--To override the default grey background for selected item-->
  <item android:drawable="@android:color/transparent" android:state_checked="true"/>
  <item android:drawable="@android:color/transparent"/>
</selector>

drawer_drawablbe.xml:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

  <item>
    <shape android:shape="rectangle">
        <solid android:color="@color/background_activity_default"/>
    </shape>
  </item>
  <item
    android:bottom="24dp"
    android:left="16dp">
      <bitmap
        android:gravity="left|bottom"
        android:src="@drawable/my_drawer_logo"/>
  </item>

</layer-list>

@drawable/my_drawer_logo 是不同密度的 PNG。

还有什么我看不到动作视图的想法吗?

【问题讨论】:

  • 我已尝试重新创建问题,但运行您的代码没有问题。可以分享@style/Text.DrawerItem 吗?
  • 其实,继续创建issue没有成功,你能不能把“@drawable/drawer_item_background”和“@drawable/drawable_background”也一样?
  • @OYRM 非常感谢您对此进行调查。我已经发布了我的样式和背景可绘制对象。但是,我尝试删除背景可绘制对象,但没有帮助。
  • @OYRM 我刚刚检查了视图层次结构,也看不到那里的视图。即使在代码中我得到了对 TextView 的引用,并且可以毫无例外地为其设置文本。我很困惑。

标签: android navigation-drawer android-support-library


【解决方案1】:

我可以很容易地更改计数器的文本。但是,我使用的文本视图在 LinearLayout 内,并且它也有一个 android:id(我在没有 LinearLayout 的情况下尝试过这个没有问题):

 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/textCounter"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center_vertical"
        android:textColor="@color/colorPrimary"
        android:text="5"/>
</LinearLayout>

鉴于此,我可以使用以下方法查看、访问和修改主要活动中的文本视图:

TextView countText = (TextView)findViewById(R.id.textCounter);

countText.setText("6");

当然,我使用一种简单的方法来计算该值,只是将其设置为值“6”,但是,我不知道您的计数器结构实际上是什么样的,而这些不是主要问题你的问题。

查看柜台号码的问题仍然是个谜。看看我上面的问题,我们也会敲定这个元素。

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
}

【讨论】:

  • 我尝试将 TextView 包装在 FrameLayout 中并为其指定一个 ID。该应用程序没有崩溃,但文本仍然不可见。该死的计数器。
  • @anoniim 我已经为活动添加了我的onCreate 文本。这与你的相比如何?
  • 经过几个小时试图找出 *** 出了什么问题,我明白了!我没有使用最新版本的支持库!无论如何,非常感谢所有的努力!
  • 很好,依赖关系可能会很麻烦。你能发布你的旧版本和新版本吗?
  • :) 我已经确认在依赖项下的模块 build.gradle 中将我的编译和支持更改为 22.+ 会重新创建相同的问题。乐于助人,祝你好运。
【解决方案2】:

我最终发现了导致问题的原因。 要让 NavigationView 与操作视图正常工作,您必须使用 AppCompat 支持库版本 23.1

所以不是

compile 'com.android.support:appcompat-v7:22.3.0'

我必须更新到

compile 'com.android.support:appcompat-v7:23.1.1'

这使得导航抽屉的导航视图中的技巧和操作视图开始正确显示,完全符合我的要求。


更新到新的 AppCompat 版本时,我遇到了更多问题,例如在启动应用程序时出现 ClassNotFoundException,我通过将 所有 com.android.support 库更新到最新版本解决了这个问题:

compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
compile 'com.android.support:recyclerview-v7:23.1.1'
compile 'com.android.support:support-annotations:23.1.1'
...

然后我仍然在我的标题布局设置为 NavigationView 中获得 NullPointerException。如果您在代码中设置app:headerLayout="@layout/drawer_header" 或类似的设置,则在AppCompat 版本22 中可以通过findViewById() 获取标题视图。

不过,AppCompat 版本 23 对所有项目(包括标题视图)使用 RecyclerView,因此获取对其视图的引用的方法如下:

 mHeaderView = navigationView.getHeaderView(HEADER_INDEX);

如果您不添加多个标题,HEADER_INDEX 很可能是 0。

【讨论】:

    猜你喜欢
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 2015-08-02
    • 2021-06-06
    • 2020-08-30
    • 1970-01-01
    相关资源
    最近更新 更多