2015-01-25 2 views
6

Я использовал панель инструментов, так что теперь я хочу применить событие click на значке логотипа, как я могу получить это событие?Является ли значок панели инструментов доступным?

здесь некоторые кодирования вещи, которые я сделал

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

Здесь я поставил навигацию значок и значок с логотипом, так что теперь я хочу событие щелчка логотипа значка, как это возможно?

ответ

21

Вы должны получить первое упоминание о нем

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

Используя описание контента, мы можем получить View ссылку. См. Комментарии в строке.

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; 
    } 
+0

Отлично! спасибо Nikola – Rajan

+0

что такое getLogoContentDescription/setLogoContentDescription –

+1

@MinaGabriel Я отредактировал свой ответ. Это должно быть getLogoDescription и setLogoDescription. Сожалею. –

11

Я задал себе тот же вопрос и наткнулся на это. Я применил аналогичный подход к Никола Деспотоски, но с другой реализацией.

Вместо метода, что я сделал:

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

Слегка хак-иш, но вернется рассмотреть его немного позже. Совместное использование для обсуждения.

+2

Спасибо за это. для меня childAt (0) является логотипом. child 1 - это название – code511788465541441

+0

Это работает для меня, но я обнаружил, что индекс изменится, это может быть 0 или 1. Я не уверен, какая разница между действиями. –

+0

Разница в том, что логотип включен и заголовок включен. Он содержит скрытые элементы, которые добавляются в группу просмотра, когда они включены, что означает, что 0-й элемент - тот, который включен первым. – Tatarize

Смежные вопросы