Android 导航图标 - 个人资料图片而不是汉堡包图标
Android Navigation Icon - Profile picture instead of hamburger icon
我正在寻找如何将打开导航抽屉的汉堡包图标更改为可以用 Picasso 或类似的东西加载的自定义图像。就像上图一样,Twitter 设法用我的个人资料图片替换了他们之前的汉堡包图标。
我在这里找不到这样的东西,我不知道如何去做。
如果有人能得到示例或指导,我将不胜感激。
编辑
我的一些Activity代码:
ActivityMapsBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_maps);
...
setSupportActionBar(binding.mapsContent.toolbar);
getSupportActionBar().setTitle("");
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, binding.drawerLayout, binding.mapsContent.toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
binding.drawerLayout.addDrawerListener(toggle);
toggle.syncState();
binding.navView.setNavigationItemSelectedListener(this);
}
@Override
public void onBackPressed() {
if (binding.drawerLayout.isDrawerOpen(GravityCompat.START)) {
binding.drawerLayout.closeDrawer(GravityCompat.START);
} else if (doubleBackToExitPressedOnce) {
super.onBackPressed();
return;
}
this.doubleBackToExitPressedOnce = true;
Toast.makeText(this, R.string.message_press_twice, Toast.LENGTH_SHORT).show();
new Handler().postDelayed(() -> doubleBackToExitPressedOnce = false, 2000);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.nav_profile:
break;
case R.id.nav_settings:
break;
}
binding.drawerLayout.closeDrawer(GravityCompat.START);
return true;
}
编辑 2 - 找到答案
在 Bruno Pinto 的帮助和一些研究之后,我终于让它成功了。
你需要创建一个 Target 并将你的 ImageView 的标签设置为这个 Target,当你用 Picasso 加载时,你引用你创建的这个 ImageView。在 Target 的构造函数中,您用加载的位图替换您的视图。
我是这样做的:
private void changeImageDrawable(){
ImageView profileImage = (ImageView) binding.navView.getHeaderView(0).findViewById(R.id.iv_profile_image);
final Target target = new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
profileImage.setImageBitmap(bitmap);
Drawable drawable = new BitmapDrawable(getResources(), bitmap);
binding.mapsContent.toolbar.setNavigationIcon(drawable);
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
};
profileImage.setTag(target);
Picasso.with(this)
.load("YOUR_IMAGE_URL_HERE")
.placeholder(R.drawable.placeholder_profile)
.error(R.drawable.placeholder_profile)
.into(target);
}
如果出现错误,您可能还应该更改视图可绘制对象或位图。
您可以使用 .setNavigationIcon() 工具栏.
中的方法
像这样:
((Toolbar) getSupportActionBar()).setNavigationIcon(YOUR_ICON);
我正在寻找如何将打开导航抽屉的汉堡包图标更改为可以用 Picasso 或类似的东西加载的自定义图像。就像上图一样,Twitter 设法用我的个人资料图片替换了他们之前的汉堡包图标。
我在这里找不到这样的东西,我不知道如何去做。
如果有人能得到示例或指导,我将不胜感激。
编辑
我的一些Activity代码:
ActivityMapsBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_maps);
...
setSupportActionBar(binding.mapsContent.toolbar);
getSupportActionBar().setTitle("");
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, binding.drawerLayout, binding.mapsContent.toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
binding.drawerLayout.addDrawerListener(toggle);
toggle.syncState();
binding.navView.setNavigationItemSelectedListener(this);
}
@Override
public void onBackPressed() {
if (binding.drawerLayout.isDrawerOpen(GravityCompat.START)) {
binding.drawerLayout.closeDrawer(GravityCompat.START);
} else if (doubleBackToExitPressedOnce) {
super.onBackPressed();
return;
}
this.doubleBackToExitPressedOnce = true;
Toast.makeText(this, R.string.message_press_twice, Toast.LENGTH_SHORT).show();
new Handler().postDelayed(() -> doubleBackToExitPressedOnce = false, 2000);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.nav_profile:
break;
case R.id.nav_settings:
break;
}
binding.drawerLayout.closeDrawer(GravityCompat.START);
return true;
}
编辑 2 - 找到答案
在 Bruno Pinto 的帮助和一些研究之后,我终于让它成功了。 你需要创建一个 Target 并将你的 ImageView 的标签设置为这个 Target,当你用 Picasso 加载时,你引用你创建的这个 ImageView。在 Target 的构造函数中,您用加载的位图替换您的视图。
我是这样做的:
private void changeImageDrawable(){
ImageView profileImage = (ImageView) binding.navView.getHeaderView(0).findViewById(R.id.iv_profile_image);
final Target target = new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
profileImage.setImageBitmap(bitmap);
Drawable drawable = new BitmapDrawable(getResources(), bitmap);
binding.mapsContent.toolbar.setNavigationIcon(drawable);
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
};
profileImage.setTag(target);
Picasso.with(this)
.load("YOUR_IMAGE_URL_HERE")
.placeholder(R.drawable.placeholder_profile)
.error(R.drawable.placeholder_profile)
.into(target);
}
如果出现错误,您可能还应该更改视图可绘制对象或位图。
您可以使用 .setNavigationIcon() 工具栏.
中的方法像这样:
((Toolbar) getSupportActionBar()).setNavigationIcon(YOUR_ICON);