我在导航栏中使用支持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);
但仍然没有运气。
我可以像
那样引用TextViewfinal 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。
为什么我看不到动作视图的其他任何想法?
答案 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。