2015-01-25 3 views
6

나는 툴바를 사용하여 이제 로고 아이콘 위에 클릭 이벤트를 적용하고 싶습니다. 어떻게이 이벤트를 얻을 수 있습니까? 여기 툴바의 로고 아이콘을 클릭 할 수 있습니까?

은 가능한 방법, 내가 여기
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 참조를 얻을 수있는 콘텐츠에 대한 설명을 사용하여

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

의 첫 번째 참조를 얻을 필요가있다. 인라인 주석을보십시오.

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

나는이 질문을 스스로에게 물어 보았습니다. 니콜라 데스 포토 스키 (Nikola Despotoski)와 비슷한 접근 방식을 취했지만 다른 구현 방식을 사용했습니다. 대신 방법의

는, 내가 한 일은이었다

// 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) 로고입니다. 자식 1은 제목이 – code511788465541441

+0

입니다.이 방법은 저에게는 효과적이지만 인덱스가 변경된다는 것을 알았습니다. 0 또는 1 일 수도 있습니다.하지만 그 차이는 무엇인지 잘 모르겠습니다. –

+0

차이점은 로고가 켜져 있고 제목이 켜져있는 순서입니다. 뷰 그룹이 활성화되었을 때 뷰 그룹에 추가 된 숨겨진 요소가 있습니다. 즉 0 번째 요소가 먼저 켜져 있음을 의미합니다. – Tatarize

관련 문제