2011-04-27 75 views
1

我正在制作一个相当基础的游戏。根据我的喜好,可以选择更改难度设置。我希望能够以某种方式在调用它的主要活动中感知它们是否改变了难度。 (然后重新启动游戏)Android - 确定用户访问后偏好是否已更改PreferenceActivity

我很困难,因为偏好活动是如何异步处理的。如果我添加逻辑来检查值,然后将意图发送到我的PreferenceActivity(从菜单选项中),它确实不起作用...

有人能指出我正确的方向吗?序列化通常异步处理的一段代码,或者想知道如何检测偏好改变?是否有隐藏在某处的监听器类?

为了后代的缘故,这里是处理意图的代码以及我失败的原因。 (片段,从菜单里面onOptionsItemSelected,开关内)

case R.id.menuOptions: 
    String currentDifficulty = preferences.getString("difficulty","problem!"); 
    Intent i = new Intent(this, prefs.class); 
    startActivity(i); 
    if (currentDifficulty.equals(preferences.getString("difficulty","problem!"))) 
     return true; 
    else doNewGame(); 
    return true; 

回答

6

Android允许您注册偏好更改侦听器。这里有一个简单的例子:

public class myClass implements OnSharedPreferenceChangeListener 
{ 
    private SharedPreferences settings; 

    settings = PreferenceManager.getDefaultSharedPreferences(this); 
    settings.registerOnSharedPreferenceChangeListener(this); 

    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) 
    { 
     // Process it here 
    } 
} 
+0

谢谢。这个例子对我非常有帮助,我将其中一名作为匿名听众,并将其连接起来以满足我的需求。 – Eric 2011-04-27 01:58:57

1

OnPreferenceChangeListener是个好主意,但你也可以使用startActivityForResult()开始自己的喜好的活动。在首选项活动返回后,您的活动将在onActivityResult()中通知(您应该覆盖它以处理首选项更改)。

+1

这会起作用,但您必须等到首选活动完成后再获取结果,而OnPreferenceChangeListener会立即通知您。 – barry 2011-12-19 20:15:01

+0

这种方法具有一些优势,特别是当您想要仅使用更改后的偏好执行一次某些操作时。例如,当您配置服务器连接时,当您为主机,端口,用户名或密码设置属性时,应用程序总是尝试连接时,会非常烦人,但在此操作之前必须设置所有属性。 – 2016-02-09 19:52:15