ActionView设置为支持NavigationView中未显示的项目

时间:2016-01-27 21:03:59

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

我在导航栏中使用支持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。

为什么我看不到动作视图的其他任何想法?

2 个答案:

答案 0 :(得分:2)

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

LinearLayout

鉴于此,我能够使用以下内容查看,访问和修改主要活动中的文本视图:

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

countText.setText( “6”);

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

您查看计数器号码的能力问题仍然是一个谜。看看我上面的问题,我们也会敲定这个元素。

 <?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>

答案 1 :(得分:1)

我最终发现了造成这个问题的原因。 要使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'
...

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

AppCompat版本23虽然使用RecyclerView来处理包括标题视图在内的所有项目,但是引用其视图的方法如下:

 mHeaderView = navigationView.getHeaderView(HEADER_INDEX);

如果您没有添加多个标头,则HEADER_INDEX最有可能为0。