In Android Studio 1.4.1 habe ich ein neues Navigations-Zeichnungsprojekt erstellt, das standardmäßig aktiviert ist. Mein Problem ist in diesem Projekt die Datei nav_header_main.xml, die für das Navigations-Header-Image und den Navigationsnamen dient. Ich möchte, dass dieses Image und der Name in meiner Hauptklassenaktivität programmgesteuert festgelegt werden. Wie das geht, habe ich viel versucht, aber die App stürzt ab.
nav_header_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
Android:layout_width="match_parent"
Android:id="@+id/headerView"
Android:layout_height="@dimen/nav_header_height"
Android:background="@drawable/side_nav_bar"
Android:gravity="bottom"
Android:orientation="vertical"
Android:paddingBottom="@dimen/activity_vertical_margin"
Android:paddingLeft="@dimen/activity_horizontal_margin"
Android:paddingRight="@dimen/activity_horizontal_margin"
Android:paddingTop="@dimen/activity_vertical_margin"
Android:theme="@style/ThemeOverlay.AppCompat.Dark">
<ImageView
Android:id="@+id/imageView"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:paddingTop="@dimen/nav_header_vertical_spacing"
Android:src="@Android:drawable/sym_def_app_icon" />
<TextView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:paddingTop="@dimen/nav_header_vertical_spacing"
Android:text="Android Studio"
Android:textAppearance="@style/TextAppearance.AppCompat.Body1" />
<TextView
Android:id="@+id/textView"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="[email protected]" />
</LinearLayout>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<Android.support.v4.widget.DrawerLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:id="@+id/drawer_layout"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true"
tools:openDrawer="start">
<include
layout="@layout/app_bar_main"
Android:layout_width="match_parent"
Android:layout_height="match_parent" />
<Android.support.design.widget.NavigationView
Android:id="@+id/nav_view"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_gravity="start"
Android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer" />
</Android.support.v4.widget.DrawerLayout>
MainActivity.Class
import Android.os.Bundle;
import Android.support.design.widget.FloatingActionButton;
import Android.support.design.widget.NavigationView;
import Android.support.design.widget.Snackbar;
import Android.support.v4.view.GravityCompat;
import Android.support.v4.widget.DrawerLayout;
import Android.support.v7.app.ActionBarDrawerToggle;
import Android.support.v7.app.AppCompatActivity;
import Android.support.v7.widget.Toolbar;
import Android.view.Menu;
import Android.view.MenuItem;
import Android.view.View;
import Android.widget.LinearLayout;
import Android.widget.Toast;
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LinearLayout headerImageView= (LinearLayout) findViewById(R.id.headerView);
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);
}
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
Toast.makeText(getApplicationContext(),"working",Toast.LENGTH_LONG).show();
return true;
}
return super.onOptionsItemSelected(item);
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
if (id == R.id.nav_camara) {
// Handle the camera action
} else if (id == R.id.nav_gallery) {
} else if (id == R.id.nav_slideshow) {
} else if (id == R.id.nav_manage) {
} else if (id == R.id.nav_share) {
} else if (id == R.id.nav_send) {
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
}
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
View hView = navigationView.getHeaderView(0);
TextView nav_user = (TextView)hView.findViewById(R.id.nav_name);
nav_user.setText(user);
ich hoffe das hilft!
Wie im Bug 190226 erwähnt, funktioniert seit dem Abrufen der Headerlayoutansicht mit: navigationView.findViewById(R.id.navigation_header_text)
die Version 23.1.0 nicht mehr.
Eine Problemumgehung besteht darin, die Kopfübersicht programmatisch aufzublasen und die Ansicht nach ID aus der aufgeblasenen Kopfansicht zu suchen.
Zum Beispiel:
View headerView = navigationView.inflateHeaderView(R.layout.navigation_header);
headerView.findViewById(R.id.navigation_header_text);
Idealerweise sollte es eine Methode getHeaderView()
geben, die jedoch bereits vorgeschlagen wurde. Lassen Sie uns sehen und warten, bis sie im Feature-Release der Design-Support-Bibliothek veröffentlicht wird.
fügen Sie keinen Header in XML hinzu. Verwenden Sie Code, um das Layout aufzublasen
View hView = navigationView.inflateHeaderView(R.layout.nav_header_main);
ImageView imgvw = (ImageView)hView.findViewById(R.id.imageView);
TextView tv = (TextView)hView.findViewById(R.id.textview);
imgvw .setImageResource();
tv.settext("new text");
Zunächst müssen Sie auf die Navigationsleiste in Ihrer MainActivity (oder auf die aufrufende Aktivität) wie folgt zugreifen:
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
Dann müssen Sie das Header-Layout aus der Datei activity_main.xml entfernen, da das Layout in der MainActivity programmgesteuert aufgeblasen wird. Ihre activity_main.xml sollte so aussehen:
<?xml version="1.0" encoding="utf-8"?>
<Android.support.v4.widget.DrawerLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:id="@+id/drawer_layout"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true"
tools:openDrawer="start">
<include
layout="@layout/app_bar_main"
Android:layout_width="match_parent"
Android:layout_height="match_parent" />
<Android.support.design.widget.NavigationView
Android:id="@+id/nav_view"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_gravity="start"
Android:fitsSystemWindows="true"
app:menu="@menu/activity_main_drawer" />
</Android.support.v4.widget.DrawerLayout>
Dann blasen wir in Ihrer MainActivity das nav_header_main-Layout auf und erhalten Zugriff auf seine Ansichten, in diesem Fall ImageView und TextView
//inflate header layout
View navView = navigationView.inflateHeaderView(R.layout.nav_header_main);
//reference to views
ImageView imgvw = (ImageView)navView.findViewById(R.id.imageView);
TextView tv = (TextView)navView.findViewById(R.id.textview);
//set views
imgvw.setImageResource(R.drawable.your_image);
tv.setText("new text");
navigationView.setNavigationItemSelectedListener(this);
Lesen Sie mehr hier
nav = ( NavigationView ) findViewById( R.id.navigation );
if( nav != null ){
LinearLayout mParent = ( LinearLayout ) nav.getHeaderView( 0 );
if( mParent != null ){
// Set your values to the image and text view by declaring and setting as you need to here.
SharedPreferences prefs = getSharedPreferences("user_data", MODE_PRIVATE);
String photoUrl = prefs.getString("photo_url", null);
String user_name = prefs.getString("name", "User");
if(photoUrl!=null) {
Log.e("Photo Url: ", photoUrl);
TextView userName = mParent.findViewById(R.id.user_name);
userName.setText(user_name);
ImageView user_imageView = mParent.findViewById(R.id.avatar);
RequestOptions requestOptions = new RequestOptions();
requestOptions.placeholder(R.drawable.ic_user_24dp);
requestOptions.error(R.drawable.ic_user_24dp);
Glide.with(this).load(photoUrl)
.apply(requestOptions).thumbnail(0.5f).into(user_imageView);
}
}
}
Hoffe das hilft.
Hier ist mein Code Unten einwandfrei Fügen Sie den Header nicht im NavigationView -Tag in activity_main.xml hinzu
<include
layout="@layout/app_bar_main"
Android:layout_width="match_parent"
Android:layout_height="match_parent" />
<Android.support.design.widget.NavigationView
Android:id="@+id/nav_view"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_gravity="start"
Android:fitsSystemWindows="true"
app:menu="@menu/activity_main_drawer"
app:itemBackground="@drawable/active_drawer_color" />
fügen Sie den Header programmatisch mit dem folgenden Code hinzu
View navHeaderView = navigationView.inflateHeaderView(R.layout.nav_header_main);
headerUserName = (TextView) navHeaderView.findViewById(R.id.nav_header_username);
headerMobileNo = (TextView) navHeaderView.findViewById(R.id.nav_header_mobile);
headerMobileNo.setText("+918861899697");
headerUserName.setText("Anirudh R Huilgol");
In Kotlin
val hView = nav_view.getHeaderView(0)
val textViewName = hView.findViewById(R.id.textViewName) as TextView
val textViewEmail = hView.findViewById(R.id.textViewEmail) as TextView
val imgvw = hView.findViewById(R.id.imageView) as ImageView
imgvw.setImageResource(R.drawable.ic_menu_gallery)
Ich weiß, dass dies ein alter Beitrag ist, aber ich bin sicher, dass dies jemandem auf der Straße helfen könnte.
Sie können einfach das headerView-Element der Navigationsansicht erhalten, indem Sie Folgendes tun:
NavigationView mView = ( NavigationView ) findViewById( R.id.nav_view );
if( mView != null ){
LinearLayout mParent = ( LinearLayout ) mView.getHeaderView( 0 );
if( mParent != null ){
// Set your values to the image and text view by declaring and setting as you need to here.
}
}
Ich hoffe, das hilft jemandem.
Es ist ein alter Beitrag, aber es ist neu für mich. So ist es einfach! In diesem Teil des Codes:
public boolean onNavigationItemSelected(MenuItem item) {
} , Habe ich eine ImageView an das LinearLayout gebunden, das die ImageView aus dem unten aufgeführten Beispiel enthält. Achtung: Es ist derselbe Code, den Sie erhalten, wenn Sie ein neues Projekt starten und die Vorlage "Navigation Drawer Activity" auswählen:
<ImageView
Android:id="@+id/imageView"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:paddingTop="@dimen/nav_header_vertical_spacing"
Android:src="@Android:drawable/sym_def_app_icon" />
Ich gab das LinearLayout und die ID in nav_header_main.xml (in meinem Fall habe ich 'navigation_header_container' gewählt), also ging es so:
LinearLayout lV = (LinearLayout) findViewById(R.id.navigation_header_container);
ivCloseDrawer = (ImageView) lV.findViewById(R.id.imageView);
ivCloseDrawer.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
drawer.closeDrawer(GravityCompat.START);
}
});
Hinweis: Vor OnCreate (MainActivity) wurde oben eine private ImageView-Komponente ivCloseDrawer deklariert.
Es hat gut funktioniert! Ich hoffe es hilft.... Beste Grüße.
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.addHeaderView(yourview);
BEARBEITEN: Funktioniert mit der Designbibliothek bis 23.0.1, funktioniert aber nicht mit 23.1.0
Im XML-Hauptlayout haben Sie NavigationView
definiert. Verwenden Sie app:headerLayout
, um die Kopfansicht festzulegen.
<Android.support.design.widget.NavigationView
Android:id="@+id/navigation_view"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_gravity="start"
app:headerLayout="@layout/nav_drawer_header"
app:menu="@menu/navigation_drawer_menu" />
Und der @layout/nav_drawer_header
wird der Platzhalter für das Bild und die Texte sein.
nav_drawer_header.xml
<?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="170dp"
Android:orientation="vertical">
<RelativeLayout
Android:id="@+id/headerRelativeLayout"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<ImageView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:scaleType="fitXY"
Android:src="@drawable/background" />
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="@dimen/action_bar_size"
Android:layout_alignParentBottom="true"
Android:layout_alignParentLeft="true"
Android:layout_alignParentStart="true"
Android:background="#40000000"
Android:gravity="center"
Android:orientation="horizontal"
Android:paddingBottom="5dp"
Android:paddingLeft="16dp"
Android:paddingRight="10dp"
Android:paddingTop="5dp">
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_marginLeft="35dp"
Android:orientation="vertical"
Android:weightSum="2">
<TextView
Android:id="@+id/navHeaderTitle"
Android:layout_width="wrap_content"
Android:layout_height="0dp"
Android:layout_weight="1"
Android:textAppearance="?android:attr/textAppearanceMedium"
Android:textColor="@Android:color/white" />
<TextView
Android:id="@+id/navHeaderSubTitle"
Android:layout_width="wrap_content"
Android:layout_height="0dp"
Android:layout_weight="1"
Android:textAppearance="?android:attr/textAppearanceSmall"
Android:textColor="@Android:color/white" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
</LinearLayout>
In Ihrer Hauptklasse können Sie Imageview
und TextView
wie normale andere Ansichten behandeln.
TextView navHeaderTitle = (TextView) findViewById(R.id.navHeaderTitle);
navHeaderTitle.setText("Application Name");
TextView navHeaderSubTitle = (TextView) findViewById(R.id.navHeaderSubTitle);
navHeaderSubTitle.setText("Application Caption");
Hoffe das hilft.
FirebaseAuth firebaseauth = FirebaseAuth.getInstance();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); //displays text of header of nav drawer.
View headerview = navigationView.getHeaderView(0);
TextView tt1 = (TextView) headerview.findViewById(R.id.textview_username);
tt1.setText(firebaseauth.getCurrentUser().getDisplayName());//username of logged in user.
TextView tt = (TextView) headerview.findViewById(R.id.textView_emailid);
tt.setText(firebaseauth.getCurrentUser().getEmail()); //email id of logged in user.
final ImageView img1 = (ImageView) headerview.findViewById(R.id.imageView_userimage);
Glide.with(getApplicationContext())
.load(firebaseauth.getCurrentUser().getPhotoUrl()).asBitmap().atMost().error(R.drawable.ic_selfie_point_icon) //asbitmap after load always.
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
img1.setImageBitmap(resource);
}
});
Ich habe diesen Code mit etwas Logik von mir selbst erstellt ... Seine Funktion läuft zu 100% ..... pls hat meine Ansage bestätigt.
Die Textansicht und die Bildansicht stammen aus @ layout/nav_header_main.xml
Sie können auch Kotlinx-Funktionen verwenden
val hView = nav_view.getHeaderView(0)
hView.textViewName.text = "lorem ipsum"
hView.imageView.setImageResource(R.drawable.ic_menu_gallery)