2017-09-09 13 views
-1

私は、ユーザーがギャラリーからイメージを選択できるカスタムプリファレンスを作成しています。これを行うために、私はそのインテントを、中間の半透明アクティビティを開始し、アクティビティをACTION_GET_CONTENTで開始し、startActivityForResultで、ユーザが選択したもののURIを維持するものに設定しました。プリファレンス値の変更をリッスンできるカスタムプリファレンス

(実は、私は一定の名前で内部メモリにファイルを保存し、タイムスタンプとの長期持続が、私はそれは私の質問には無関係だと思う。)

今私はImageViewのを更新したいです私は、PreferenceサブクラスのsetWidgetスペースで、新たに選択したイメージを使用しています。カスタムのPreferenceクラスは、独自の設定キーの値に対する変更をどのようにリスニングできますか?

onBindView()に画像を設定していますが、これは環境設定画面がレイアウトされているときにのみ呼び出されます。私は様々なビルトイン・プリファレンスのソースを見てきましたが、どれもプリファレンスを選択するためのアクティビティーを開いていないのでこの問題はありません。彼らはすべて、好みに戻ることができるダイアログを持っているか、onClick()で内部的に行動を起こすことができます。

しかし、ACTION_GET_CONTENTアクティビティを使用せずにギャラリー画像を選択させる方法は考えられません。

パブリックメソッドを追加してから、自分のPreferenceActivityでOnSharedPreferenceChangedListenerを使用して、プリファレンスを手動で呼び出して更新することができます。しかし、私はこのクラスを複数のプロジェクトで使用するためにライブラリに入れたいと思います(そして後でオープンソースライブラリで公開する可能性があります)。そのため、これらの手作業をすべて必要とするのは非常に醜いです。

答えて

1

RingtonePreferenceにチェックを入れましたか?これにより、着信音ピッカーのアクティビティが起動され、自分自身をPreferenceManager.OnActivityResultListenerリスナーとして登録することによって結果が処理されるため、所有アクティビティによって委任されます。

ソースコードから選択スニペット:

@Override 
protected void onAttachedToHierarchy(PreferenceManager preferenceManager) { 
    super.onAttachedToHierarchy(preferenceManager); 

    preferenceManager.registerOnActivityResultListener(this); 
    mRequestCode = preferenceManager.getNextRequestCode(); 
} 

public boolean onActivityResult(int requestCode, int resultCode, Intent data) { 

    if (requestCode == mRequestCode) { 

     if (data != null) { 
      Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); 

      if (callChangeListener(uri != null ? uri.toString() : "")) { 
       onSaveRingtone(uri); 
      } 
     } 

     return true; 
    } 

    return false; 
} 

EDIT:


public class TestPreference extends Preference implements SharedPreferences.OnSharedPreferenceChangeListener { 
    public TestPreference(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

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

    public TestPreference(Context context) { 
     super(context); 
    } 

    @Override 
    protected void onAttachedToHierarchy(PreferenceManager preferenceManager) { 
     super.onAttachedToHierarchy(preferenceManager); 
     getSharedPreferences().registerOnSharedPreferenceChangeListener(this); 
    } 

    @Override 
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
     if (key.equals(getKey())) { 
      // Update myself 
     } 
    } 
} 

そして、あなたの活動はその後onActivityResultでプリファレンスを更新します。

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    SharedPreferences preferences = getSharedPreferences("Name of shared preferences", MODE_PRIVATE); 
    // OR use default 
    // SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); 
    preferences.edit().putString("custom_preference_key", "VALUE").apply(); 
} 
+0

私はRingtonePreferenceを見落とし。しかし、それは私のクラスに内部的に動作するようにすることはまだできません。 PreferenceManagerの 'getActivity()'/'getFragment()'はパッケージ保護されています。したがって、PreferenceのIntentを設定できますが、Preferenceはそれが所有しているアクティビティを知らないので、 'startActivityForResult()'を呼び出すことはできません。 – Tenfour04

+0

ああ、申し訳ありませんが、それらの方法がパッケージプライベートであることを認識していませんでした。 'onActivityResult'の設定キーを更新し、あなたの好みの変更を聞くことができますか?更新された回答をご覧ください。 – dominicoder

+0

それは動作します!ニース。私は、これが完全にクリーンな解決策であるという1つの障壁がまだあることを認識しています。中間アクティビティは、それを使用するすべてのプロジェクトに登録する必要があります。しかし、少なくともそれは単なるライナーです。 – Tenfour04

関連する問題