6

GitHub での質問に対して、簡単なテスト プロジェクトを用意しました。

私のプロジェクトには、カスタムのインライン SeekBarPreferenceがあり、ほとんど正常に動作します (シークバーがドラッグされるとその概要が更新され、整数値が保存されます)。

アプリのスクリーンショット

ただし、問題があります。

アプリの最初の実行時 (もう一度エラーを表示しようとすると、アプリをアンインストールSeekBarする必要がある場合があります) の進行状況は設定されていません (ただし、概要は設定されています)。

アプリのスクリーンショット

私の質問は: 私のコードでこの問題を修正するにはどうすればよいですか?

SeekBarPreference.java のさまざまな場所にmSeekBar.setProgress (mProgress) を追加しようとしましたが、そのコードの正しい場所が見つかりません。

以下は私のソース コードからの抜粋です (Stackoverflow が GitHub よりも長生きした場合に備えて) -

MainActivity.java :

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

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

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 (完全なソース コード):

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

アップデート:

私がソファで失敗したこと -

onCreateView()1)メソッドに次の行を追加します。

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

setValue()2)メソッドに次の行を追加します。

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

残念ながら、これは機能しません。進行状況はmSeekBar0 のままです。

また、Google による SeekBarPreferenceもありますが、そこでどのように機能するか (またはまったく機能するかどうか) はわかりません。

4

4 に答える 4

4

onGetDefaultValueでオーバーライドする必要がありますSeekBarPreference

これを試して:

@Override
protected Object onGetDefaultValue(TypedArray a, int index) {
    return a.getInt(index, 0);
}
于 2015-05-13T20:52:52.210 に答える
0

インスタンス化すると

mSeek1 = (SeekBarPreference) findPreference(SEEK_1);

プライベート int mProgress; は 0 です

したがって、mProgress の SeekBarPreference にセッターを追加し、その値を設定すると、おそらく役立つでしょう。

mSeek1 = (SeekBarPreference) findPreference(SEEK_1);
mSeek1.setMProgress(valueIhopeIsKnownAtThisMonent);
于 2015-05-13T15:12:42.700 に答える