0

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

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,但它位于静态类中的匿名类中......我能做些什么来解决我的问题?

4

1 回答 1

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)会抛出一个异常。

于 2015-05-24T12:30:04.153 回答