自定义内联SeekBarPreference - 如何在第一次运行时设置SeekBar进度?

2024-04-11

我已经准备好了一个简单的测试项目 https://github.com/afarber/android-newbie/tree/q19/MyPrefs我在 GitHub 上提出的问题。

我的项目中有一个自定义inline 搜索栏首选项 https://github.com/afarber/android-newbie/blob/q19/MyPrefs/src/de/afarber/myprefs/SeekBarPreference.java,大多数情况下工作正常(当拖动搜索栏时更新其摘要并保存整数值):

然而有一个问题:

在应用程序第一次运行时(您可能需要卸载当您尝试再次看到错误时我的应用程序)的进度SeekBar未设置(但已设置摘要):

我的问题是:如何在我的代码中解决这个问题?

我尝试在不同位置添加 mSeekBar.setProgress(mProgress)SeekBarPreference.java https://github.com/afarber/android-newbie/blob/q19/MyPrefs/src/de/afarber/myprefs/SeekBarPreference.java,但就是找不到该代码的正确位置。

以下是我的源代码的摘录(以防 Stackoverflow 比 GitHub 更长寿)-

MainActivity.java https://github.com/afarber/android-newbie/blob/q19/MyPrefs/src/de/afarber/myprefs/MainActivity.java:

PreferenceManager.setDefaultValues(this, R.xml.preferences, false);

getFragmentManager().beginTransaction()
    .addToBackStack(null)
    .replace(R.id.root, new PrefFragment(), "prefs")
    .commit();

PrefFragment.java https://github.com/afarber/android-newbie/blob/q19/MyPrefs/src/de/afarber/myprefs/PrefFragment.java:

@Override
public void onResume() {
    super.onResume();

    SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
    // set the summaries from saved values
    onSharedPreferenceChanged(prefs, SEEK_1);
    onSharedPreferenceChanged(prefs, SEEK_2);
    prefs.registerOnSharedPreferenceChangeListener(this);
}

@Override
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {

    if (SEEK_1.equals(key)) {
        int i1 = prefs.getInt(key, DEFAULT_1);
        mSeek1.setSummary("$ " + i1);
    } else if (SEEK_2.equals(key)) {
        int i2 = prefs.getInt(key, DEFAULT_2);
        mSeek2.setSummary("$ " + i2);
    }       
}  

SeekBarPreference.java https://github.com/afarber/android-newbie/blob/q19/MyPrefs/src/de/afarber/myprefs/SeekBarPreference.java(完整源代码):

public class SeekBarPreference extends Preference implements OnSeekBarChangeListener {

    private SeekBar mSeekBar; // FIXME how to set its progress?
    private int mProgress;

    public SeekBarPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected View onCreateView(ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(R.layout.preference_seekbar, parent, false);
        // can also be done in onBindView, does not work either
        mSeekBar = (SeekBar) view.findViewById(R.id.seekbar);
        mSeekBar.setProgress(mProgress);
        mSeekBar.setOnSeekBarChangeListener(this);
        return view;
    }

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        if (!fromUser)
            return;

        setValue(progress);
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
        // not used
    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        // not used
    }

    @Override
    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
        setValue(restoreValue ? getPersistedInt(mProgress) : (Integer) defaultValue);
    }

    public void setValue(int value) {
        if (shouldPersist()) {
            persistInt(value);
        }

        if (value != mProgress) {
            mProgress = value;
            notifyChanged();
        }
    }
}

UPDATE:

到目前为止我没有成功的尝试 -

1)将以下行添加到onCreateView() method:

    int progress = getPersistedInt(mProgress); // shows 0 in debugger
    mSeekBar.setProgress(progress);

2)将以下行添加到setValue() method:

    if (value != mProgress) {
        mProgress = value;
        mSeekBar.setProgress(mProgress);
        notifyChanged();
    }

唉,这行不通,进展mSeekBar保持在 0。

另外,还有一个Google 的 SeekBarPreference https://github.com/android/platform_frameworks_base/blob/master/core/java/android/preference/SeekBarPreference.java- 但我不明白它是如何在那里工作的(或者它是否有效)。


你需要覆盖onGetDefaultValue in SeekBarPreference.

尝试这个:

@Override
protected Object onGetDefaultValue(TypedArray a, int index) {
    return a.getInt(index, 0);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义内联SeekBarPreference - 如何在第一次运行时设置SeekBar进度? 的相关文章

  • Android 在画布上遮罩位图生成黑色空间

    我有一个蒙版位图 一半是红色 一半是透明的 如下所示https www dropbox com s 931ixef6myzusi0 s 2 png https www dropbox com s 931ixef6myzusi0 s 2 pn
  • 如何使用 WifiEnterpriseConfig 设置“使用系统证书”

    我想为我的应用程序的用户配置企业 WiFi 网络 因此 用户必须输入用户名和密码 其余的由应用程序处理 身份验证由 RADIUS 服务器 FreeRadius 3 处理 该服务器使用 LetsEncrypt 颁发的证书 因此无需导入我自己的
  • 有没有一种方法可以在不使用意图的情况下在活动之间发送数据?

    我有一个对于每个用户来说都是唯一的用户名 我想将其发送到某个活动 但我不想使用意图 create an intent and sends username Intent intent new Intent RegisterOwner thi
  • 在Java中测试服务器是否启动的正确方法?

    简单地查看是否可以建立与网站 服务器的连接的正确方法是什么 我想要这个用于我正在编码的应用程序 如果我的网站离线 它只会提醒我 Thanks 您可以使用 HttpURLConnection 发送请求并检查响应正文中是否有该页面特有的文本 而
  • app-release-unsigned.apk 未签名

    我在 github 上下载了 Android 应用程序的 zip 文件 并尝试运行它 但出现一个包含此消息的对话框 app release unsigned apk is not signed Please configure the si
  • 尝试获取屏幕上绘制的每个随机圆圈的 x、y 坐标

    您好 我正在制作一款游戏 该游戏将在屏幕上创建随机圆圈 随机创建的圆圈的值为红色或绿色 我的问题是 我希望不仅能够确定用户何时单击其中一个圆圈 而且还能够确定他们最终单击的圆圈 红色或绿色 下面是我的代码 我的主要问题是试图找到将要绘制的圆
  • 作为附件的 Android 设备

    我有 2 个 Android 设备 我想用 USB OTG 电缆连接它们 并在两个设备之间进行来回通信 据我了解 一台 Android 设备将充当 USB 主机 运行 4 4 的 Nexus 7 另一台 Android 设备将充当 USB
  • 该项目可能使用的 Gradle 版本不包含“compileSdkVersion()”方法

    当我尝试运行最初在 Eclipse ADT 上创建的项目时 我遇到了这个问题 Error 17 0 Gradle DSL method not found compileSdkVersion Possible causes ul li Th
  • 合并 dex 程序类型已存在时出错:android.support.v4.os.ResultReceiver$MyResultReceiver

    合并dex时出错 以下是依赖项 ext anko version 0 10 5 support lib 1 0 0 alpha1 room lib 1 1 0 dependencies implementation org jetbrain
  • Android volley使用RequestFuture.get()时出现超时异常

    在我的片段中 我尝试使用 TMDB 的开放电影数据库来获取有关 正在播放 电影的详细信息 如果我使用 RequestFuture get time TimeUnit 方法来执行此齐射请求 我总是会收到超时错误 如果我在 Safari 中手动
  • 从 Android 访问云存储

    我一直无法找到任何有关如何从 Android 应用程序使用云存储的具体文档 我确实遇到过这个客户端库 https cloud google com storage docs reference libraries然而 Google Clou
  • Android 解析 JSON 卡在 get 任务上

    我正在尝试解析一些 JSON 数据 我的代码工作了一段时间 我不确定我改变了什么突然破坏了代码 当我运行代码时 我没有收到任何运行时错误或警告 我创建一个新的 AsyncTask 并执行它 当我打电话时 get 在这个新任务中 调试器在此行
  • 如何使用共享首选项在两个 Android 应用程序之间共享数据?

    我有两个应用程序 App1 和 App2 我想使用共享首选项在 App1 中保存数据并在 App2 中访问 反之亦然 我可以在 App1 中保存数据并在 App2 中访问数据 但反之则不行 这就是我现在正在做的 在清单中 android s
  • 分离 Fragment 和删除 Fragment 有什么区别?

    在 Android 文档中碎片交易 http developer android com reference android app FragmentTransaction html我注意到两种非常相似的方法 detach and remo
  • 如何关闭导航抽屉以使用返回主页图标按钮?

    我也将操作栏与搜索栏一起使用 并且我需要像后退按钮一样使用 ActionBar ico 但我也在使用导航抽屉 如何关闭 隐藏 禁用导航抽屉菜单以使用后退按钮 我的 ActionBar 代码 Override public boolean o
  • 通知操作而不启动新活动?

    我计划提供一个包含两个操作的提醒通知 一个用于批准登录请求 一个用于拒绝登录请求 通过单击这些操作中的任何一个 我希望向我的服务器发出 HTTP 请求 最重要的是 我不想启动新的 Activity 或根本不想将用户重定向到我的应用程序 Co
  • 可用屏幕的尺寸

    我使用的是 Nexus 7 1280x800 android 4 2 2 API 17 我想获取屏幕的大小 将其划分为相同高度和宽度的正方形部分 我正在使用 FrameLayout 我的方块是 ImageView 的子类 我这样做 cont
  • 如何从一个活动检索 Double 值到另一活动?

    我制作了一个包含 2 个活动的应用程序 其中第一个活动包含一些 EditText 十进制数字 另一个活动也包含一些 EditText 十进制 现在我想将一个 EditText 的值传递给另一个 但作为 双 而不是作为一个字符串 因为该值将用
  • 在循环中按名称访问变量

    我正在开发一个 Android 项目 并且有很多可绘制对象 这些绘图的名称都类似于icon 0 png icon 1 png icon 100 png 我想将这些可绘制对象的所有资源 ID 添加到整数 ArrayList 中 对于那些不了解
  • Android 版本低于 Lollipop 时出现 java.lang.NoClassDefFoundError

    我有一台运行 Android 21 的 Nexus 5 设备 我正在测试我的项目 没有任何问题 但是 如果我使用 Google API 19 在模拟器上进行测试 则会显示错误java lang NoClassDefFoundError 如果

随机推荐

  • Rust 中的线程局部变量将使用多少字节?

    我想使用类型的线程局部变量Option
  • ES6 WeakMap 类封装

    我试图理解为什么我需要使用 Wea kMaps 来创建私有类成员 而不是仅仅使用普通变量 它们都使用闭包和模块导入来创建封装 function encapsulation const my var My secret info const
  • 使用 MySQL 时,在 NHibernate 中使用 Guid 作为 Id 列会导致格式异常

    当我定义 NHibernate 实体 映射以使用 Guid 作为标识列时 我收到一个异常 Guid 列生成为 varchar 40 但内容似乎是二进制的 有针对这个的解决方法吗 目前我只使用普通的 ol int 但如果知道对于未来的项目会很
  • Django请求GET参数值列表

    我想做一些排序 我想要的是使用名为 ordering 的参数执行 GET 请求 如下所示 该值将是我将用于排序的模型属性 如下所示 order age height 问题是当我尝试接收订单参数时 该值是一个列表 我尝试像这样使用 as if
  • 查看寻呼机 + ImageView + 捏合缩放 + 旋转

    我想在 Imageview 上实现捏缩放 在 View Pager 中类似于默认 Android Gallery 我在 GitHub 上找到了多个源 但缩放和滑动仅适用于第一个图像 我尝试过的 1 触摸图像视图 https github c
  • 如何从缓冲图像中获取子图像

    我们可以使用 BufferedImage 获取子图像getSubimage int int int int 但我的问题是我想通过传递双值来获得精确的子图像 矩形图像 width and height 有什么替代方案吗 将 double 值转
  • FragmentTransation setCustomAnimations 不起作用

    我尝试使用新的 android 兼容性包将片段包含到我的项目中 我试图在添加新片段时包含过渡动画 这只是我的动画作品之一 In 动画有效 但 Out 动画无效 我在某处读到这是兼容性包中的一个错误 但我还了解到该错误已在兼容性包的第三版中修
  • 是否有从 Maven 到 Bazel 的迁移路径?

    现在巴泽尔 http bazel io http bazel io 已经开源了 是否有一个增量过程可以让我逐渐从 Maven 迁移 一个大型存储库 到 Bazel 我在研究巴泽尔 不 据我们所知 没有这样的过程 我希望 我们一直在运行一些从
  • iOS Swift 3 参数前面有下划线

    今天我在Xcode中打开我的项目 需要将当前的Swift转换为Swift 3 转换后 我发现函数的所有参数前面都有一个下划线 例如 func didGetWeather weather Weather 我尝试去掉下划线 效果很好 我想知道这
  • IE9 ReactJs 中未定义“Set”或“Map”

    我使用 React 16 2 0 创建了一个简单的应用程序 当我在 IE9 上执行 运行它时 它显示控制台错误 Set 或 Map 未定义 我发现在 IE9 上运行我的 React 应用程序需要一些填充 我按照以下步骤操作 它对我有用 由于
  • MPL pos 是一个未记录的元函数吗?

    里面有下面的示例代码BOOST MPL 文档find算法 http www boost org doc libs 1 46 1 libs mpl doc refmanual find html typedef vector
  • 什么是部分视图?

    我一直在使用 Codeigniter 来习惯模型 视图 控制器架构 并尝试加快制作和实现网站的过程 我不断看到对 部分视图 的引用 但找不到该术语的定义 谁能告诉我什么是部分视图以及它在哪里使用 部分视图只是可以包含在父视图中的子视图 我们
  • Sonata 管理捆绑包 - 表单类型:sonata_type_collection - 自定义模板?

    是否可以覆盖表单类型的模板 sonata type collection 我已经尝试过以下方法 formMapper gt add slides sonata type collection array array edit gt inli
  • 如何将“element.offsetParent”与 HTML SVG 元素一起使用?

    我正在对一些 javascript 进行维护 它使用 offsetParent http www quirksmode org js findpos html财产 最近的更改现在使应用程序使用 SVG 元素 并且它们破坏了 JavaScri
  • 如何在 Iphone 上显示带有 UIButton 的 UINavigationController?

    在我的应用程序中 第一个视图是一个 UIView 带有几个 uilabel 和一个 uibutton 来进行登录 我想在登录后显示一个带有表格的 uinavigationcontroller 因此可以使用按钮的操作 我知道如何从 Xcode
  • Python 中的(命名)元组字典和速度/RAM 性能

    我正在创建一本字典d一百万个元组项目 理想情况下我想通过以下方式访问它们 d 1634 id or d 1634 id d 1634 name or d 1634 name d 1634 isvalid or d 1634 isvalid
  • 如何使用 vba 将临时记录集导出到 csv 文件

    我有一个 MS Access 表 正在跟踪 50 种产品及其每日销量 我想使用 vba 1 csv 文件 包括标题 导出每个产品 显示记录集中的每日交易量 而不将记录集保存到永久查询 我正在使用下面的代码 但我陷入了下面代码中突出显示的实际
  • 如何在静态服务器上托管 ReactJS 项目

    我已经构建了一个 React 应用程序 它在本地服务器上运行良好 但是 当我运行 npm run build 时 该过程似乎正确执行 创建 build 文件夹 其中包含捆绑的 js 文件和 index html 文件 但是当我在浏览器中打开
  • 每个用户的子域

    我拥有一个网站 为每个注册用户提供一个专用空间 如下所示 www mywebpage com user1 www mywebpage com user2 www mywebpage com user3在这条路径中 用户有他的迷你网站 我想为
  • 自定义内联SeekBarPreference - 如何在第一次运行时设置SeekBar进度?

    我已经准备好了一个简单的测试项目 https github com afarber android newbie tree q19 MyPrefs我在 GitHub 上提出的问题 我的项目中有一个自定义inline 搜索栏首选项 https