自定义在线搜索栏preference - 如何设置一号运行搜索栏的进展? [英] Custom inline SeekBarPreference - how to set SeekBar progress on the 1st run?

查看:245
本文介绍了自定义在线搜索栏preference - 如何设置一号运行搜索栏的进展?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有prepared 一个简单的测试项目我在GitHub上的问题。

I have prepared a simple test project for my question at GitHub.

在我的项目有一个自定义的内联的<一个href=\"https://github.com/afarber/android-newbie/blob/q19/My$p$pfs/src/de/afarber/my$p$pfs/SeekBar$p$pference.java\"相对=nofollow>搜索栏preference ,其中大部分是工作正常(当搜索栏被拖动及其摘要进行更新,并将其保存整数值):

In my project there is a custom inline SeekBarPreference, which mostly works fine (its summary is updated when seekbar is being dragged and it saves integer value):

但有一个问题:

在应用程序的非常第一次运行(当您试图再次看到错误,您可能需要为卸载我的应用程序)的搜索栏未设置(但摘要设置):

On the very 1st run of the app (you might need to uninstall my app when you try see the error again) the progress of the SeekBar is not set (but the summaries are set):

我的问题是:如何在我的code解决这个问题。

My question is: how to fix this issue in my code?

我曾尝试在<不同点加入mSeekBar.setProgress(mProgress) href=\"https://github.com/afarber/android-newbie/blob/q19/My$p$pfs/src/de/afarber/my$p$pfs/SeekBar$p$pference.java\"相对=nofollow>搜索栏preference.java ,但就是无法找到该code正确的位置。

I have tried adding mSeekBar.setProgress(mProgress) in different spots of SeekBarPreference.java, but just can't find the correct place for that code.

下面是我的源$ C ​​$ C摘录(如果有史以来#1 GitHub上会超越) -

Below are excerpts from my source code (in case Stackoverflow ever outlives GitHub) -

<一个href=\"https://github.com/afarber/android-newbie/blob/q19/My$p$pfs/src/de/afarber/my$p$pfs/MainActivity.java\"相对=nofollow> MainActivity.java :

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

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

<一个href=\"https://github.com/afarber/android-newbie/blob/q19/My$p$pfs/src/de/afarber/my$p$pfs/$p$pfFragment.java\"相对=nofollow> 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);
    }       
}  

<一个href=\"https://github.com/afarber/android-newbie/blob/q19/My$p$pfs/src/de/afarber/my$p$pfs/SeekBar$p$pference.java\"相对=nofollow>搜索栏preference.java (完整的源$ C ​​$ C):

SeekBarPreference.java (the complete source code):

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

更新:

我已经尝试过失败SOFAR -

What I have unsuccessfully tried sofar -

1)添加以下行 onCreateView()方法:

1) Adding the following lines to the onCreateView() method:

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

2)添加以下行的setValue()方法:

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

唉这不起作用,的 mSeekBar 保持为0的进展。

此外,还有一个<一href=\"https://github.com/android/platform_frameworks_base/blob/master/core/java/android/$p$pference/SeekBar$p$pference.java\"相对=nofollow>搜索栏preference由谷歌 - 但我不明白它是如何工作有(或者如果它在所有工作)

Also, there is a SeekBarPreference by Google - but I don't understand how it works there (or if it works at all).

推荐答案

您需要重写 onGetDefaultValue 搜索栏preference

试试这个:

@Override
protected Object onGetDefaultValue(TypedArray a, int index) {
    return a.getInt(index, 0);
}

这篇关于自定义在线搜索栏preference - 如何设置一号运行搜索栏的进展?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆