【问题标题】:Android - Change Hamburger/Back icons color programmatically during runtimeAndroid - 在运行时以编程方式更改汉堡包/后退图标颜色
【发布时间】:2015-01-15 22:51:47
【问题描述】:

我正在尝试以编程方式在运行时更改我的应用的样式属性“colorControlNormal”,但没有任何结果。

此属性是用于为新工具栏视图组的汉堡包和后退图标着色的颜色。另外,我正在使用 v7 兼容库。

我听说我们无法在运行时更改应用主题,但我正在寻找答案,即使它不是那么干净。

编辑:

我只是想 gmail 正在做我想做的事,当你点击搜索图标时,白色的汉堡图标会变成灰色的背面。

等待更多。

【问题讨论】:

  • 你能分享一下你到目前为止的尝试吗?
  • 只有在setContentView()setContentView()之前才可以在运行时更改主题
  • 只有在操作栏使用自定义视图时才能更改颜色。
  • @Bacs:从现在开始我没有尝试过任何东西,我不知道该尝试什么:/
  • @pdegand59 我想要别的东西,在 setcontentview 之后做一些事情......

标签: android android-5.0-lollipop android-toolbar


【解决方案1】:

我花了一天时间,尝试了不同的实现。所以我认为,最好的方法是从 AppCompat v7 库中复制粘贴 DrawerArrowDrawable。

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

你还需要在你的片段中等待动画不会完成,但这是另一个问题。

如果您有任何问题,请在 cmets 中提问。

【讨论】:

    猜你喜欢
    • 2017-07-09
    • 2021-03-17
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多