android - SeekBar setProgress 破坏次要进度

标签 android android-5.0-lollipop seekbar

我的主要进度和次要进度同时增长,次要进度比主要进度增长得更快。 每次我更新主要进度时,次要进度都会丢失(就像它为零或小于主要进度一样)。这会产生令人讨厌的闪烁。

我发现的唯一解决方法是在设置主要后将次要设置为自身。我添加了“+1”,因为 SeekBar 有一个检查,如果我设置相同的值则不会重绘。

        mSeekBar.setProgress(newPosition);
        mSeekBar.setSecondaryProgress(mSeekBar.getSecondaryProgress()+1); // WTF?

第二行可能会修复它,但它看起来很荒谬,我想效率也很低。

这发生在 Lollipop (5.0.1) - API 21 上。 它以前工作正常 - 不知道为什么。

如果我为 API 级别 19 构建,它工作正常。 (视频:API19Seekbar)

targetSdkVersion 19
compile 'com.android.support:appcompat-v7:19.+'

如果我为 API 级别 21 构建它会闪烁。 (视频:API21SeekBar)

targetSdkVersion 21
compile 'com.android.support:appcompat-v7:21.+'

完整示例 Activity 代码如下:

int delay1 = 1000;
int delay2 = 200;
int primaryProgress;
int secondaryProgress;

boolean mStarted;
Button mButton;
SeekBar mSeekBar;
Handler h1 = new Handler();
Handler h2 = new Handler();

Runnable primary = new Runnable() {
    @Override
    public void run() {
        primaryProgress = (primaryProgress + 1) % 100;
        mSeekBar.setProgress(primaryProgress);
        h1.postDelayed(primary, delay1);
    }
};

Runnable secondary = new Runnable() {
    @Override
    public void run() {
        secondaryProgress = (secondaryProgress + 1) % 100;
        mSeekBar.setSecondaryProgress(secondaryProgress);
        h2.postDelayed(secondary, delay2);
    }
};


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mButton = (Button)findViewById(R.id.button);
    mButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            buttonClick();
        }
    });
    mSeekBar = (SeekBar)findViewById(R.id.seekBar);
}

private void buttonClick() {
    mStarted = !mStarted;
    if (mStarted) {
        mButton.setText("Started");
        h1.postDelayed(primary, delay1);
        h2.postDelayed(secondary, delay2);
    } else {
        mButton.setText("Stopped");
        h1.removeCallbacks(primary);
        h2.removeCallbacks(secondary);
    }

}

最佳答案

这已在下一个 Android 版本中修复,但目前最好的解决方法可能是复制 scrubber_progress_horizontal_material.xml及其来自 SDK 资源 ( <sdk-root>/platforms/android-21/data/res/... ) 的 9 补丁 PNG,然后重新排列标签,以便 <layer-list>是根。

修改后的 XML 应该是这样的:

drawable-v21/scrubber_progress_horizo​​ntal_material_fixed.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/background">
        <nine-patch
            android:src="@drawable/scrubber_track_mtrl_alpha"
            android:tint="?android:attr/colorControlNormal" />
    </item>
    <item android:id="@android:id/secondaryProgress">
        <scale android:scaleWidth="100%">
            <selector>
                <item android:state_enabled="false">
                    <color android:color="@android:color/transparent" />
                </item>
                <item>
                    <nine-patch
                        android:src="@drawable/scrubber_primary_mtrl_alpha"
                        android:tint="?android:attr/colorControlNormal" />
                </item>
            </selector>
        </scale>
    </item>
    <item android:id="@android:id/progress">
        <scale android:scaleWidth="100%">
            <selector>
                <item android:state_enabled="false">
                    <color android:color="@android:color/transparent" />
                </item>
                <item>
                    <nine-patch
                        android:src="@drawable/scrubber_primary_mtrl_alpha"
                        android:tint="?android:attr/colorControlActivated" />
                </item>
            </selector>
        </scale>
    </item>
</layer-list>

然后适当修改values-v21/styles.xml和/或您的布局 XML,以便您在 API 21+ 上默认使用此背景。如果您需要,我可以提供这些示例。

关于android - SeekBar setProgress 破坏次要进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28290950/

相关文章:

安卓NDK : Function va_start/va_end could not be resolved

android 5 和 xml 布局中的 onClick

android - 电子邮件 Intent 不再适用于 Android Lollipop

安卓音频搜索栏

android - 如何自定义搜索栏的缩略图

android - adb shell : can't use the ESCAPE key

android - 通过删除前一个 fragment 来替换当前 fragment

android - 服务生成器改造

android - 如何从 Android appcompat v7 21 库中设置 DrawerArrowToggle 的样式

android:自定义 slider 上的视觉问题