Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is toolbar's logo icon clickable?

i have used toolbar so now i want to apply click event over logo icon how can i get this event?

here is some coding stuff that i have done

Toolbar toolbar = null;
toolbar = (Toolbar) findViewById(R.id.actionToolbar);
setSupportActionBar(toolbar);
setTitle(null);
toolbar.setNavigationIcon(R.drawable.back);
toolbar.setNavigationContentDescription("BACK");
toolbar.setLogo(R.drawable.ic_launcher);
toolbar.setLogoDescription("LOGO");

toolbar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Toast.makeText(MainActivity.this, "Nav", Toast.LENGTH_SHORT).show();
    }
});

Here i have set navigation icon and logo icon so now i want logo icon's click event, how it is possible?

like image 625
Rajan Avatar asked Jan 25 '15 11:01

Rajan


3 Answers

You need to get first reference of it

View logoView = getToolbarLogoView(toolbar);
logoView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //logo clicked
    }
});

Using content description we can get View reference. See the comments inline.

public static View getToolbarLogoIcon(Toolbar toolbar){
        //check if contentDescription previously was set
        boolean hadContentDescription = android.text.TextUtils.isEmpty(toolbar.getLogoDescription());
        String contentDescription = String.valueOf(!hadContentDescription ? toolbar.getLogoDescription() : "logoContentDescription");
        toolbar.setLogoDescription(contentDescription);
        ArrayList<View> potentialViews = new ArrayList<View>();
        //find the view based on it's content description, set programatically or with android:contentDescription
        toolbar.findViewsWithText(potentialViews,contentDescription, View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION);
        //Nav icon is always instantiated at this point because calling setLogoDescription ensures its existence 
        View logoIcon = null;
        if(potentialViews.size() > 0){
            logoIcon = potentialViews.get(0);
        }
        //Clear content description if not previously present
        if(hadContentDescription)
            toolbar.setLogoDescription(null);
        return logoIcon;
    }
like image 150
Nikola Despotoski Avatar answered Nov 16 '22 23:11

Nikola Despotoski


I was asking myself the same question and came across this. I took a similar approach to Nikola Despotoski but with a different implementation.

Instead of the method, what I did was:

// Set drawable
toolbar.setLogo(ContextCompat.getDrawable(context, R.drawable.logo));

// Find logo
View view = toolbar.getChildAt(1);
view.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
      // Perform actions
    }
  });

Slightly hack-ish, but will come back review it a bit later. Sharing for discussion purposes.

like image 44
Mingsheng Avatar answered Nov 17 '22 00:11

Mingsheng


Long-click event behavior for the appcompat:V7 ActionBar's logo view (ImageView)

    ActionBar actionBar = getSupportActionBar();
    actionBar.setLogo(R.drawable.logo_vjet);
    actionBar.setDisplayShowTitleEnabled(false);
    actionBar.setDisplayShowHomeEnabled(true);
    actionBar.setDisplayUseLogoEnabled(true);
    //find ActionBar View(ToolBar)
    View view = getWindow().getDecorView().findViewById(android.support.v7.appcompat.R.id.action_bar);
    if(view != null && view instanceof Toolbar){
        try {
            //find ImageView mLogoView; in Toolbar using reflect
            Field logoView = view.getClass().getDeclaredField("mLogoView");
            logoView.setAccessible(true);
            ImageView logoImageVIew = (ImageView) logoView.get(view);
            if(logoImageVIew != null){
                logoImageVIew.setOnLongClickListener(new View.OnLongClickListener() {
                    @Override
                    public boolean onLongClick(View v) {
                        //do something
                        return false;
                    }
                });
            }
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

tested only android 7.0

like image 40
JumpToHell Avatar answered Nov 17 '22 00:11

JumpToHell