自定义 NavigationView - 添加动态 headerView,Android 支持设计库
Customising NavigationView - Adding dynamic headerView, Android Support Design Library
我尝试了新 android 支持设计库中的 navigationView。我想要一个动态标题视图。基本上,我的 headerview 会显示类似今日报价的内容。我有大约 10 个引号,我想随机 select 一个引号并显示在 headerView 的文本视图中。我还想为 headerView 添加 onClick 方法。
现在,我看不到任何以编程方式更改标题视图布局的可能性。有什么实施建议吗?
您可以通过在导航视图上调用 addHeaderView
以编程方式添加您的自定义 header,或者使用 app:headerLayout="@layout/myheader"
.
在布局文件中定义它
创建页眉布局在内部显示文本视图,
<TextView
android:id="@+id/profile_email_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@id/profile_image"
android:layout_alignParentBottom="true"
android:layout_toLeftOf="@id/expand_account_box_indicator"
android:ellipsize="end"
android:maxLines="1"
android:paddingBottom="16dp"
android:singleLine="true"
android:clickable="true"
android:onClick="onSelectText"
android:text="dhaval0122@gmail.com"
android:textColor="@color/body_text_2_inverse"
android:textSize="@dimen/text_size_medium" />
在 onCreate 中,
((TextView) findViewById(R.id.profile_email_text)).setText("test");
在您的 activity
中创建方法 onSelectText
public void onSelectText(View v){
if(v.getId() == R.id.profile_email_text){
Snackbar
.make(fab, "clicked on sub title", Snackbar.LENGTH_LONG)
//.setAction(R.string.snackbar_action, myOnClickListener)
.show();
drawer_layout.closeDrawers();
}
}
先创建headerXML喜欢lay_header.xml
<TextView
android:id="@+id/tvThought"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
在您的 java 文件中,在 TextView 中将其膨胀到 header 以上。喜欢
TextView headerView = (TextView) LayoutInflater.from(this).inflate(R.layout.lay_header, null);
headerView.setText("Your_thoght");
现在将其添加为 HeaderView
navView = (NavigationView) findViewById(R.id.navView);
navView.addHeaderView(headerView);
就是这样...
您可以使用 findViewById()
访问 NavigationView 中的 header 元素。即使您已经使用 headerLayout 属性 初始化了 header,这仍然有效,例如app:headerLayout="@layout/drawer_header"
。然后,您可以动态修改 header,而无需膨胀或添加新的 header。
@Override
public boolean onNavigationItemSelected(final MenuItem menuItem) {
...
if(mNavItemId == R.id.drawer_item_1)
{
View headerView = mNavigationView.findViewById(R.id.drawer_header_root);
// Test modifying the size of the header root element (FrameLayout)
// when the first menu item is clicked.
LinearLayout.LayoutParams p = (LinearLayout.LayoutParams) headerView.getLayoutParams();
p.height = p.height == 700 ? 400 : 700;
headerView.setLayoutParams(p);
return true;
}
...
drawer_header.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="196dp"
android:background="@color/drawer_header_bg"
android:orientation="vertical"
android:id="@+id/drawer_header_root">
...
我认为 Dhawal 也在说同样的话,但不是很清楚。
TextView txt2;
txt2 = (TextView) navigationView.inflateHeaderView(R.layout.nav_header_main).findViewById(R.id.textView2);
txt2.setText("wow! It works like a charm");
新支持库更新后(23.1.1),
你可以这样做 -
在 NavigationView 的 app:headerLayout="@layout/drawer_header"
中添加 headerview。
然后,您可以通过
访问它
View header = navigationView.getHeaderView(0);
TextView text = (TextView) header.findViewById(R.id.textView);
或者如果您有多个 headers
navigationView.getHeaderCount()
参考:https://code.google.com/p/android/issues/detail?id=190226#c31
我就是这个link会帮助你
final NavigationView navigationView = (NavigationView) findViewById(R.id.navigation_view);
View headView = navigationView.getHeaderView(0);
((TextView) headView.findViewById(R.id.nav_title)).setText("New title");
首先你必须获得navigationView。
NavigationView navigationView =(NavigationView)findViewById(R.id.nav_view);
然后header。
View header = navigationView.getHeaderView(0)
然后是文本视图。
TextView text = (TextView) header.findViewById(R.id.textView);
最后,您可以设置要显示的文本。
text.setText("Hello there");
我尝试了新 android 支持设计库中的 navigationView。我想要一个动态标题视图。基本上,我的 headerview 会显示类似今日报价的内容。我有大约 10 个引号,我想随机 select 一个引号并显示在 headerView 的文本视图中。我还想为 headerView 添加 onClick 方法。
现在,我看不到任何以编程方式更改标题视图布局的可能性。有什么实施建议吗?
您可以通过在导航视图上调用 addHeaderView
以编程方式添加您的自定义 header,或者使用 app:headerLayout="@layout/myheader"
.
创建页眉布局在内部显示文本视图,
<TextView
android:id="@+id/profile_email_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@id/profile_image"
android:layout_alignParentBottom="true"
android:layout_toLeftOf="@id/expand_account_box_indicator"
android:ellipsize="end"
android:maxLines="1"
android:paddingBottom="16dp"
android:singleLine="true"
android:clickable="true"
android:onClick="onSelectText"
android:text="dhaval0122@gmail.com"
android:textColor="@color/body_text_2_inverse"
android:textSize="@dimen/text_size_medium" />
在 onCreate 中,
((TextView) findViewById(R.id.profile_email_text)).setText("test");
在您的 activity
中创建方法onSelectText
public void onSelectText(View v){
if(v.getId() == R.id.profile_email_text){
Snackbar
.make(fab, "clicked on sub title", Snackbar.LENGTH_LONG)
//.setAction(R.string.snackbar_action, myOnClickListener)
.show();
drawer_layout.closeDrawers();
}
}
先创建headerXML喜欢lay_header.xml
<TextView
android:id="@+id/tvThought"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
在您的 java 文件中,在 TextView 中将其膨胀到 header 以上。喜欢
TextView headerView = (TextView) LayoutInflater.from(this).inflate(R.layout.lay_header, null);
headerView.setText("Your_thoght");
现在将其添加为 HeaderView
navView = (NavigationView) findViewById(R.id.navView);
navView.addHeaderView(headerView);
就是这样...
您可以使用 findViewById()
访问 NavigationView 中的 header 元素。即使您已经使用 headerLayout 属性 初始化了 header,这仍然有效,例如app:headerLayout="@layout/drawer_header"
。然后,您可以动态修改 header,而无需膨胀或添加新的 header。
@Override
public boolean onNavigationItemSelected(final MenuItem menuItem) {
...
if(mNavItemId == R.id.drawer_item_1)
{
View headerView = mNavigationView.findViewById(R.id.drawer_header_root);
// Test modifying the size of the header root element (FrameLayout)
// when the first menu item is clicked.
LinearLayout.LayoutParams p = (LinearLayout.LayoutParams) headerView.getLayoutParams();
p.height = p.height == 700 ? 400 : 700;
headerView.setLayoutParams(p);
return true;
}
...
drawer_header.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="196dp"
android:background="@color/drawer_header_bg"
android:orientation="vertical"
android:id="@+id/drawer_header_root">
...
我认为 Dhawal 也在说同样的话,但不是很清楚。
TextView txt2;
txt2 = (TextView) navigationView.inflateHeaderView(R.layout.nav_header_main).findViewById(R.id.textView2);
txt2.setText("wow! It works like a charm");
新支持库更新后(23.1.1),
你可以这样做 -
在 NavigationView 的 app:headerLayout="@layout/drawer_header"
中添加 headerview。
然后,您可以通过
访问它View header = navigationView.getHeaderView(0);
TextView text = (TextView) header.findViewById(R.id.textView);
或者如果您有多个 headers
navigationView.getHeaderCount()
参考:https://code.google.com/p/android/issues/detail?id=190226#c31
我就是这个link会帮助你
final NavigationView navigationView = (NavigationView) findViewById(R.id.navigation_view);
View headView = navigationView.getHeaderView(0);
((TextView) headView.findViewById(R.id.nav_title)).setText("New title");
首先你必须获得navigationView。
NavigationView navigationView =(NavigationView)findViewById(R.id.nav_view);
然后header。
View header = navigationView.getHeaderView(0)
然后是文本视图。
TextView text = (TextView) header.findViewById(R.id.textView);
最后,您可以设置要显示的文本。
text.setText("Hello there");