[英]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
: 在SettingsActivity
的onCreate()
方法中:
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.