Как сделать значок ящика и логотип двумя разными кнопками в ActionBar

У меня проблема, когда мне нужно иметь возможность щелкнуть как логотип, так и стрелку назад + гамбургер/обслуживать на панели действий. когда у меня ничего нет в моем заднем стеке, отображается значок гамбургера, который открывает мой левый ящик (затем с помощью анимации он меняется на стрелку, чтобы закрыть ящик).

Отображение значка рядом с AppLogo:

getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

У меня есть ActionBarDrawerToggle, чтобы проверить, открыт ли левый ящик (потому что у меня также есть правый ящик, который не должен мешать анимации значка гамбургера).

ActionBarDrawerToggle

 mDrawerListener = new ActionBarDrawerToggle(this, drawerLayout, R.string.drawer_open, R.string.drawer_closed) {

        //must override these methods to make only left drawer change the icon of drawer in the corner, when opened

        @Override
        public void onDrawerSlide(View drawerView, float slideOffset) {
            if (drawerView.getId() == R.id.left_drawer) {
                super.onDrawerSlide(drawerView, slideOffset);
            }
        }

        @Override
        public void onDrawerOpened(View drawerView) {
            if (drawerView.getId() == R.id.left_drawer) {
                super.onDrawerOpened(drawerView);
            }
        }

        @Override
        public void onDrawerClosed(View drawerView) {
            if (drawerView.getId() == R.id.left_drawer) {
                super.onDrawerClosed(drawerView);
            }
        }
    };
    drawerLayout.setDrawerListener(mDrawerListener);

Когда навигация возможна, значок меняется на Стрелку, отключая индикатор

onBackStackChanged()

@Override
    public void onBackStackChanged() {
        // disable drawer icon and leave backarrow icon if backstack not empty
        boolean canBack = getSupportFragmentManager().getBackStackEntryCount() > 0;
        if (canBack) {
            mDrawerListener.setDrawerIndicatorEnabled(false);
        } else {
            mDrawerListener.setDrawerIndicatorEnabled(true);
        }
    }

В OnOptionsItemSelected() я позабочусь о том, чтобы левый ящик (с закрытым правым) ИЛИ было выполнено действие navigationBack.

OnOptionsItemSelected()

public boolean onOptionsItemSelected(MenuItem item) {
    Helper.dismissKeyboard(this);
    switch (item.getItemId()) {
        case android.R.id.home:
            if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
                onSupportNavigateUp();
            } else {
                if (drawerLayout.isDrawerOpen(drawerSports)) {
                    drawerLayout.closeDrawer(drawerSports);
                } else {
                    if (drawerLayout.isDrawerOpen(lvMyAccount)) {
                        drawerLayout.closeDrawer(lvMyAccount);
                    }
                    drawerLayout.openDrawer(drawerSports);
                }

            }
            return true;

Стили.xml

 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:actionBarStyle">@style/MyActionBar</item>
    <item name="actionBarStyle">@style/MyActionBar</item>
</style>

<style name="MyActionBar" >
    <item name="android:background">@color/blue</item>
    <item name="background">@color/blue</item>
    <item name="android:logo">@drawable/logo_marathon</item>
    <item name="logo">@drawable/logo_marathon</item>
    <item name="android:displayOptions">showHome|useLogo</item>
    <item name="displayOptions">showHome|useLogo</item>

</style>
 ...

Это не мой проект, поэтому я могу не знать, как именно все настроено, и я не могу вносить в него какие-либо серьезные изменения без необходимости, поэтому мне нужно добавить метод onClick к логотипу, и я не знаю, как это сделать. Пробовал <item name="onClick">customLogoClickMethod</item>, не помогло.


person Lukas Stančikas    schedule 14.05.2015    source источник


Ответы (1)


создайте представление, которое вы хотите на панели действий. установите на нем всех слушателей, а затем установите представление на панель действий с помощью getActionBar().setCustomView();

eg:

getActionBar().setDisplayOptions(
                ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_USE_LOGO
                        | ActionBar.DISPLAY_SHOW_HOME
                        | ActionBar.DISPLAY_HOME_AS_UP);

        LayoutInflater inflater = (LayoutInflater) this
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        // inflate the view that we created before
        View v = inflater.inflate(R.layout.sample_titlebar, null);

//set all the listeners here with that view 
//and than

getActionBar().setCustomView();
person vaibhav    schedule 15.05.2015
comment
Спасибо, я попробую это, но вы, вероятно, имели в виду getActionBar().setCustomView(v); И если я использую пользовательский вид с ImageView в качестве моего логотипа, мне, вероятно, не нужен DISPLAY_USE_LOGO, я прав? - person Lukas Stančikas; 15.05.2015
comment
Оно работает! Мне просто нужно было удалить DISPLAY_USE_LOGO и теги логотипа из styles.xml и создать макет только с изображением. Еще раз спасибо, как я не подумал об этом раньше! - person Lukas Stančikas; 15.05.2015
comment
не переживай бывает!! Спасибо stackoverflow !! - person vaibhav; 15.05.2015