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);