Android - изменить цвет значков гамбургера/назад программно во время выполнения

Я пытаюсь изменить атрибут стиля «colorControlNormal» моего приложения программно и во время выполнения, но у меня нет никаких результатов.

Это свойство представляет собой цвет, который будет подкрашивать значки гамбургера и задней части новой группы просмотра панели инструментов. Кроме того, я использую библиотеку совместимости v7.

Я слышал, что мы не можем изменить тему приложения во время выполнения, но я ищу ответ, даже если это не так чисто.

Редактировать:

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

Ожидание большего.


person zadkiel    schedule 18.11.2014    source источник
comment
Можете ли вы поделиться тем, что вы пробовали до сих пор?   -  person Bacs    schedule 18.11.2014
comment
Вы можете изменить тему во время выполнения, только если вы делаете это до setContentView()   -  person pdegand59    schedule 18.11.2014
comment
вы можете изменить цвет, только если вы используете пользовательский вид для панели действий.   -  person Martin    schedule 18.11.2014
comment
@Bacs: с этого момента я ничего не пробовал, я не знаю, что попробовать :/   -  person zadkiel    schedule 20.11.2014
comment
@pdegand59 pdegand59 Я хочу что-то еще, что-то, что можно было бы сделать с моими фрагментами, после setcontentview ...   -  person zadkiel    schedule 20.11.2014
comment
Затем вам нужно создать собственный вид на панели действий или перезагрузить активность с новой темой.   -  person pdegand59    schedule 25.11.2014


Ответы (1)


Потратил один день, поигрался с разной реализацией. Итак, мое мнение, лучший способ сделать это скопировать и вставить DrawerArrowDrawable из библиотеки AppCompat v7.

https://gist.github.com/IstiN/5d542355935fd7f0f357 — взгляните на код с некоторая оптимизация

чем вы можете использовать его в своей основной деятельности с кодом ниже

        DrawerArrowDrawable drawable = new DrawerArrowDrawable(this, this);
        ImageView menuButton = (ImageView) findViewById(R.id.arrow);
        menuButton.setImageDrawable(drawable);
        menuButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ((DrawerLayout)findViewById(R.id.drawer)).openDrawer(Gravity.START);
            }
        });

когда вы начинаете новый фрагмент, вам нужно создать еще один вид на том же месте и добавить второй код в ваш фрагмент

    private DrawerArrowDrawable mArrowDrawable;

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        mArrowDrawable = new DrawerArrowDrawable(getActivity(), getActivity());
        ImageView topButton = (ImageView) view.findViewById(R.id.arrow);
        topButton.setImageDrawable(mArrowDrawable);
        topButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                closeSearch();
            }
        });

        //run animation from hamburger to arrow
        animate(0, 1, null);
        ....

    private void animate(int startValue, int endvalue, Animator.AnimatorListener listener) {
        ValueAnimator anim = ValueAnimator.ofFloat(startValue, endvalue);
        anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                float slideOffset = (Float) valueAnimator.getAnimatedValue();
                mArrowDrawable.setProgress(slideOffset);
            }
        });
        anim.setInterpolator(new DecelerateInterpolator());
        anim.setDuration(300);
        if (listener != null) {
            anim.addListener(listener);
        }
        anim.start();
    }

сделать анимацию от стрелки до кнопки возврата ручки гамбургера и выполнить код

animate(1, 0, null);

вам также нужно подождать в вашем фрагменте, пока анимация не закончится, но это другие вопросы.

Если есть вопросы задавайте в комментариях.

person Vova K.    schedule 14.04.2015