2012-05-10 12 views
1

Professional Android Programming with Mono for Android and .Net/C# (202〜204ページ)の書籍を参考にしようとしています。変更リスナーを登録し、登録解除するAndroid用モノラルを使用した設定変更のリッスン

それは次のサンプルコードを示します。コースの

using System; 
using System.Text; 

using Android.App; 
using Android.Content; 
using Android.OS; 
using Android.Runtime; 
using Android.Views; 
using Android.Widget; 
using Android.Preferences; 

namespace MonoForAndroidPreferences 
{ 
    [Activity(Label = "User Preferences")] 
    public class UserPreferences : PreferenceActivity 
    { 
     protected override void OnCreate(Bundle bundle) 
     { 
      base.OnCreate(bundle); 

      // Create your application here 
      this.AddPreferencesFromResource(Resource.Layout.userpreferences); 
     } 

     protected override void OnResume() 
     { 
      base.OnResume(); 

      this.GetPreferences(FileCreationMode.Private).RegisterOnSharedPreferenceChangeListener(this); 
     } 

     protected override void OnPause() 
     { 
      base.OnPause(); 

      this.GetPreferences(FileCreationMode.Private).UnregisterOnSharedPreferenceChangeListener(this); 
     } 

     public void OnSharedPreferenceChanged(ISharedPreferences prefs, string key) 
     { 
      // Do something with the changed value pointed to by key 
     } 
    } 
} 

両方RegisterOnSharedPreferenceChangeListenerUnregisterOnSharedPreferenceChangeListenerUserPreferencesからISharedPreferencesOnSharedPreferenceChangeListenerに変換することができません。

私は、作者がこれが動作するためにどういう意味があるのか​​分かりません。どんな助けでも大歓迎です。

サンプルコードをwrox.comからダウンロードしようとしましたが、サンプルコードの環境設定の変更をリッスンしませんでした。

EDIT:更新が好みで行われたとき

次のコードはコンパイルが、OnSharedPreferenceChanged決して呼び出されます。

public class UserPreferences : PreferenceActivity, ISharedPreferencesOnSharedPreferenceChangeListener 
    { 
     protected override void OnCreate(Bundle bundle) 
     { 
      base.OnCreate(bundle); 

      // Create your application here 
      this.AddPreferencesFromResource(Resource.Layout.userpreferences); 
     } 

     protected override void OnResume() 
     { 
      base.OnResume(); 

      this.GetPreferences(FileCreationMode.Private).RegisterOnSharedPreferenceChangeListener(this); 
     } 

     protected override void OnPause() 
     { 
      base.OnPause(); 

      this.GetPreferences(FileCreationMode.Private).UnregisterOnSharedPreferenceChangeListener(this); 
     } 

     void ISharedPreferencesOnSharedPreferenceChangeListener.OnSharedPreferenceChanged(ISharedPreferences prefs, string key) 
     { 
      // Do something with the changed value pointed to by key 
     } 
    } 

答えて

2

あなたが

PreferenceScreen.SharedPreferences.RegisterOnSharedPreferenceChangeListener(this); 

代わりに、私はまったく同じ例を挙げて取り組んでいた

this.GetPreferences(FileCreationMode.Private).RegisterOnSharedPreferenceChangeListener(this); 
+1

SharedPreferencesはPreferenceScreenクラスの静的プロパティではないので、このコードの動作方法はわかりません。 – TimothyP

+0

@TimothyPが同意しましたが、これは動作しません。 – Fammy

2

あなたが気づいたとして、あなたはそれらのメソッドにISharedPreferencesOnSharedPreferenceChangeListenerを実装するクラスのインスタンスを与える必要があります。これは、別のクラスかもしれない、またはあなたが「これは」というサンプルのように、そのインターフェイスを実装するクラスを変更使用する場合:

[Activity(Label = "User Preferences")] 
public class UserPreferences : PreferenceActivity, ISharedPreferencesOnSharedPreferenceChangeListener 
{ 
    // OnCreate, OnResume, etc 

    public void OnSharedPreferenceChanged(ISharedPreferences sharedPreferences, string key) 
    { 
    } 
} 
+0

ありがとうございました。あなたの推薦を得て、私は "void ISharedPreferencesOnSharedPreferenceChangeListener.OnSharedPreferenceChanged(ISharedPreferences prefs、string key)"を使ってコンパイルするようにしました。しかし、更新が行われたときに呼び出されることはありません。 –

0

これはissue I had with my Samsung Galaxy Nexusの症状である可能性があります。 Andriod 4.0.2の電話機に古いAndroid 2.3.4の電話機で問題なく動作していたアプリをデバッグしたところ、OnStartOnResumeOnPauseOnStopのいずれのイベントも発生していませんでした。

このような新しい携帯電話で作業している場合は、Mono for Androidのプロジェクトプロパティで「armeabi-v7a」をサポートされているアーキテクチャとして追加してみてください。

お客様のサポートニーズに応じて、just offer the "armeabi-v7a" architectureになる場合があります。

4

の使用する必要がある、とOnPauseとOnResumeイベントが火になっても問題ありませんでした。

一時停止/再開時にリスナーを登録/登録解除するのには効果がありましたが、問題はありませんでした。リスナー自体は決して解雇されませんでした。

実際のUserPreferencesインテントに切り替えると、OnPauseが発生し、リスナーの登録が解除されました。私はそれから戻ってきました。しかし、それは問題の一部に過ぎませんでした。私もこの方法を使用して、適切にロードするためのプリファレンスを取得できませんでした

this.GetPreferences(FileCreationMode.Private).RegisterOnSharedPreferenceChangeListener(this); 

(私は別の名前を持っていた使用していた活動は、ランチャーはPreferencesDemoActivityと呼ばれていましたし、好み自体はによって処理されていたので、その理由だったと仮定UserPreferences-以下を参照)。

残念ながら

PreferenceScreen.SharedPreferences.RegisterOnSharedPreferenceChangeListener(this); 

で上記の答えとしてマークされたソリューションは、(それがSharedPreferencesが静的コンテキストで利用可能ではない文句)のいずれかに動作しません。

すべてのOnPause/OnResume/Listenerコードを内のUserPreferencesクラスのに移動すると、すべて正常に機能しました。

しかし、それは私には良いことではありませんでした。私は自分のMAINアプリを使って、環境設定の変更に即座に反応し、環境設定画面から戻るときにそれらをすべて読み直して変更をチェックする必要がありました。

私は私の(別の)環境設定画面で変更何かは、このようにそれを実装したときに起動するために私の「メイン」クラスで実際OnSharedPreferenceChangedリスナーを得ることができる唯一の方法:

[Activity(Label = "More user preferences", MainLauncher = true, Icon = "@drawable/icon")] 
public class PreferencesDemoActivity : Activity, ISharedPreferencesOnSharedPreferenceChangeListener 
{ 
    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 

     // Set our view from the "main" layout resource 
     SetContentView(Resource.Layout.Main); 

     // Get our button from the layout resource, 
     // and attach an event to it 
     Button button = FindViewById<Button>(Resource.Id.MyButton); 

     // !!!NB !!! Remember to implement ISharedPreferencesOnSharedPreferenceChangeListener in this class, 
     // or you'll never get to OnSharedPreferenceChanged method 
     PreferenceManager.GetDefaultSharedPreferences(this).RegisterOnSharedPreferenceChangeListener(this); 

     button.Click += delegate 
          { 
           Intent i = new Intent(this, new UserPreferences().Class); 
           this.StartActivityForResult(i, 0); // this ensures that we come back to this one when we exit the pref screen 
          }; 

    } 


    /// <summary> 
    /// Remember to implement ISharedPreferencesOnSharedPreferenceChangeListener in this class, or you'll never get this method to compile 
    /// </summary> 
    /// <param name="sharedPreferences"></param> 
    /// <param name="key"></param> 
    public void OnSharedPreferenceChanged(ISharedPreferences sharedPreferences, string key) 
    { 
     Log.Debug("MUP", string.Format("Preference {0} changed", key)); 

     if (key == "PREF_AUTO_UPDATE") 
     { 
      bool autoRefresh = sharedPreferences.GetBoolean("PREF_AUTO_UPDATE", false); 
      Log.Debug("MUP", string.Format("Preference {0} changed to {1}", key, autoRefresh)); 
     } 

    } 

私のために働きました、私の問題を解決しました。キーはPreferenceManager.GetDefaultSharedPreferencesを使用するように見えました。

+1

これは確かに解決策のようです。この本に示唆されているようにonPauseにハンドラの登録を解除することも追加したいのですが、OnSharedPreferenceChangdが呼び出されることを防ぎます – TimothyP

+0

ありがとう@TimothyP、良い点! – wislon

関連する問題