简体   繁体   English

onclick侦听器,用于Android中的首选项活动

[英]onclick listener for preference activity in Android

I was following this documentations to create a setting page. 我正在关注此文档以创建设置页面。 I have created two java classes based on the documentation: 我根据文档创建了两个java类:

SettingsFragment.java: SettingsFragment.java:

public static class SettingsFragment extends PreferenceFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.preferences);
    }
    ...
}

SettingsActivity.java SettingsActivity.java

public class SettingsActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Display the fragment as the main content.
        getFragmentManager().beginTransaction()
                .replace(android.R.id.content, new SettingsFragment())
                .commit();
    }
}

In the preference I have an item with key premium_support which I want to create a click listener for it. 在首选项中,我有一个带有密钥premium_support的项目,我想为它创建一个点击监听器。

 <CheckBoxPreference
        android:key="@string/premium_support"
        android:title="Premium Support"
        android:summary="Purchase premium support"
        android:defaultValue="false" />

I can't create a click listener in the fragment because I have my in app billing codes in the SettingsActivity . 我无法在片段中创建点击监听器,因为我在SettingsActivity中有我的应用内帐单代码。 I tried this answer but seems like findPreference is only for the preferencefragment. 我尝试了这个答案,但似乎findPreference只适用于preferencefragment。

Any idea how to implement the click listener in SettingsActivity? 知道如何在SettingsActivity中实现点击监听器吗?

In the onCreate() method of SettingsActivity : SettingsActivityonCreate()方法中:

Preference preference = findPreference("prefs_key");
preference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
   @Override
   public boolean onPreferenceClick(Preference preference) {
       Toast.makeText(SettingsActivity.this, "Clicked", Toast.LENGTH_SHORT).show();
       return true;
   }
});

The 'findPreference' method can only be called on the settingsfragment because it extends preferencefragment. 'findPreference'方法只能在settingsfragment上调用,因为它扩展了preferencefragment。 You need to get a reference to the settingsfragment class in the settings activity like below: 您需要在设置活动中获取对settingsfragment类的引用,如下所示:

    private SettingsFragment settingsFragment;

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTitle("SETTINGS");

         //instantiate the settings fragment
         settingsFragment= new SettingsFragment();
        getFragmentManager().beginTransaction()
                .replace(android.R.id.content, settingsFragment)
                .commit();
    }

You then override onResume and set the preferenceclicklistener in onresume and not oncreate because the commit() method is called asynchronously ( ie the code does not execute immediately) and the preference value might be null if you call findpreference immediately after commiting the fragment transaction in oncreate. 然后重写onResume并在onresume中设置preferenceclicklistener而不是oncreate,因为commit()方法是异步调用的(即代码不立即执行)如果在oncreate中提交片段事务后立即调用findpreference,则首选项值可能为null 。

    @Override
        protected void onResume() {
            super.onResume();
            Preference preference = 
          settingsFragment.findPreference(getString(R.string.pref_key));
            preference.setOnPreferenceClickListener(new 
            Preference.OnPreferenceClickListener() {
                @Override
                public boolean onPreferenceClick(Preference preference) {
                   //respond to click events here
                    return true;
                }
            });

        }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM