新しいAndroidサポートデザインライブラリからnavigationViewを試してみました。動的なヘッダービューが必要です。基本的に、ヘッダービューにはその日の引用のようなものが表示されます。引用をランダムに選択し、headerViewのテキストビューに表示したいまた、headerViewにonClickメソッドを追加したい。
現時点では、ヘッダービューのレイアウトをプログラムで変更する可能性はありません。これを実装するための提案はありますか?
最初にlay_header.xmlのようなヘッダーXMLを作成します
<TextView
Android:id="@+id/tvThought"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content" />
あなたのJavaファイルはTextViewの上記のヘッダーを膨張させます。
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);
それでおしまい...
新しいサポートライブラリの更新(23.1.1)の後、
これを行うことができます-
NavigationView内のapp:headerLayout="@layout/drawer_header"
にヘッダービューを追加します。
その後、次の方法でアクセスできます。
View header = navigationView.getHeaderView(0);
TextView text = (TextView) header.findViewById(R.id.textView);
または、複数のヘッダーがある場合
navigationView.getHeaderCount()
参照: https://code.google.com/p/Android/issues/detail?id=190226#c31
TextView txt2;
txt2 = (TextView) navigationView.inflateHeaderView(R.layout.nav_header_main).findViewById(R.id.textView2);
txt2.setText("wow! It works like a charm");
ヘッダーレイアウトを作成し、内部にテキストビューを表示します。
<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="[email protected]"
Android:textColor="@color/body_text_2_inverse"
Android:textSize="@dimen/text_size_medium" />
onCreateで、
((TextView) findViewById(R.id.profile_email_text)).setText("test");
アクティビティで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();
}
}
findViewById()
を使用して、NavigationView内のヘッダー要素にアクセスできます。これは、headerLayoutプロパティでヘッダーを初期化した場合でも機能します。 app:headerLayout="@layout/drawer_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">
...
ダワールも同じことを言っていると思いますが、それはあまり明確ではありませんでした。
NavigationViewでaddHeaderView
を呼び出してプログラムでカスタムヘッダーを追加するか、app:headerLayout="@layout/myheader"
を使用してレイアウトファイルで定義することができます。
私のこのリンクはあなたを助けます
final NavigationView navigationView = (NavigationView) findViewById(R.id.navigation_view);
View headView = navigationView.getHeaderView(0);
((TextView) headView.findViewById(R.id.nav_title)).setText("New title");