Android OnPreferenceClickListener

Posted

技术标签:

【中文标题】Android OnPreferenceClickListener【英文标题】: 【发布时间】:2015-08-06 01:15:12 【问题描述】:

我有一个Activity,它使用PreferenceFragment 显示设置菜单。有一种方法可以将Beans 列表传递给片段,因此它可以动态生成Preferences 列表,我想基本上像按钮一样操作。我正在尝试使用OnPreferenceClickListener 对被单击的首选项之一做出反应,但我需要让最外面的活动知道这一点。我的代码如下所示:

public class PairActivity extends Activity 
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        fragment = new SettingsFragment();
        getFragmentManager().beginTransaction()
                .replace(android.R.id.content, fragment)
                .commit();
        ...
    


    public static class SettingsFragment extends PreferenceFragment 
        public void displayBeans(Collection<Bean> beans) 
            ...
            for(Bean bean : beans) 
                Preference pref = new Preference(getActivity());
                pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() 
                    @Override
                    public boolean onPreferenceClick(Preference preference) 
                        // want to let the Activity know something happened
                    
                );
            
        
    

    ...

评论显示我想从哪里访问 Activity,但它位于静态类中的匿名类中......我可以做些什么来解决我的问题?

【问题讨论】:

((PairActivity)SettingsFragment.this.getActivity()) 是可能的,但我担心这行代码中某处可能会出现问题... 【参考方案1】:

编辑:

使您的SettingsFragment 成为PairActivity内部 类:

public class PairActivity extends Activity 

    public class SettingsFragment extends PreferenceFragment 

    


然后您可以安全地使用PairActivity.this 引用该活动。

编辑:

这是您链接的一个很好的答案,并且确实是这样使用它的正确方法。我没想到。

不过,当片段附加到活动时,您可以使用getActivity 引用它。如果您从 clickListener 内部调用此方法,则片段肯定会附加到活动,因此可以这样做:

public class PairActivity extends Activity 
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        fragment = new SettingsFragment();
        getFragmentManager().beginTransaction()
                .replace(android.R.id.content, fragment)
                .commit();
        ...
    


    public static class SettingsFragment extends PreferenceFragment 
        public void displayBeans(Collection<Bean> beans) 
            ...
            for(Bean bean : beans) 
                Preference pref = new Preference(getActivity());
                pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() 
                    @Override
                    public boolean onPreferenceClick(Preference preference) 
                        PairActivity pairActivity = (PairActivity) getActivity();
                        // Do something with pairActivity instance
                    
                );
            
        
    

    ...

您只需要确保您没有将片段附加到另一个活动,因为演员 (PairActivity) 会抛出异常。

【讨论】:

我已经尝试过了,Android Studio 将此标记为潜在问题。有this question在谈论为什么不应该这样做,但我是新手,所以我不太了解。

以上是关于Android OnPreferenceClickListener的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )

android 21 是啥版本

Android逆向-Android基础逆向(2-2)

【Android笔记】android Toast

图解Android - Android核心机制

Android游戏开发大全的目录