[英]Android - Preference OnPreferenceClick is never called
[英]Android OnPreferenceClick is not called on click
我有一個首選項片段,在其中我調用setOnClickListener()
作為首選項並覆蓋onPreferenceClick()
方法。 但是,單擊首選項時不會調用我的新方法。
通過將代碼移到我的自定義EditTextPreference
類,可以使ClickListener
正常工作,但是必須啟用首選項才能觸發偵聽器。
我想將此首選項用作標簽來顯示值,並單擊它顯示選項以對其進行更改。 我不希望用戶直接對其進行編輯。
我怎樣才能做到這一點?
代碼如下
public class PrefActivity extends PreferenceActivity {
static final String TAG="Preference Activity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getFragmentManager().beginTransaction().replace(android.R.id.content, new MyPreferenceFragment()).commit();
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
}
public static class MyPreferenceFragment extends PreferenceFragment
{
@Override
public void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
Preference clickedPreference = (Preference) findPreference("userLocation");
clickedPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
// TODO Auto-generated method stub
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(preference.getContext());
boolean locationTypeSetting;
LocationSetting locationSetting = new LocationSetting(preference.getContext());
String clickedPreference = preference.getKey();
if (clickedPreference.equals("userLocation")){
locationTypeSetting = settings.getBoolean("locationSetting", false);
if (locationTypeSetting == true)
{
AlertDialog.Builder noEditDialogBuilder = new AlertDialog.Builder(preference.getContext());
noEditDialogBuilder.setTitle(R.string.no_edit_dialog_title);
noEditDialogBuilder
.setMessage(R.string.no_edit_dialog_message)
.setPositiveButton(R.string.no_edit_dialog_positive_action,null);
AlertDialog noEditDialog = noEditDialogBuilder.create();
noEditDialog.show();
}
else
locationSetting.displayMap(0);
}
return false;
}
});
}
}
}
我的偏好XML
<SwitchPreference
android:defaultValue="0"
android:key="locationSetting"
android:summary="Automatic Location"
android:switchTextOff="OFF"
android:switchTextOn="ON" />
<com.example.test.EditTextPreferenceWithSummary
android:key="userLocation"
android:title="Address"
android:shouldDisableView="false"
android:enabled="false"
android:selectable="true" />
我的EditTextPreferenceWithSummary類
public class EditTextPreferenceWithSummary extends EditTextPreference {
private final static String TAG = EditTextPreferenceWithSummary.class.getName();
@Override
protected View onCreateView(ViewGroup parent) {
this.setSummary(this.getText());
return super.onCreateView(parent);
}
public EditTextPreferenceWithSummary(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public EditTextPreferenceWithSummary(Context context) {
super(context);
init();
}
private void init() {
Log.e(TAG, "init");
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this.getContext());
String currentText = prefs.getString("userLocation", this.getText());
this.setSummary(currentText);
setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
preference.setSummary(newValue.toString());
return true;
}
});
}
}
我刪除了片段,直接使用類。 還是一樣的問題
代碼如下
public class PrefActivity extends PreferenceActivity {
static final String TAG="Preference Activity";
@SuppressWarnings("deprecation")
@Override
public void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
Preference clickedPreference = (Preference) findPreference("userLocation");
clickedPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
// TODO Auto-generated method stub
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(preference.getContext());
boolean locationTypeSetting;
LocationSetting locationSetting = new LocationSetting(preference.getContext());
String clickedPreference = preference.getKey();
if (clickedPreference == "userLocation"){
locationTypeSetting = settings.getBoolean("locationSetting", false);
if (locationTypeSetting == true)
{
AlertDialog.Builder noEditDialogBuilder = new AlertDialog.Builder(preference.getContext());
noEditDialogBuilder.setTitle(R.string.no_edit_dialog_title);
noEditDialogBuilder
.setMessage(R.string.no_edit_dialog_message)
.setPositiveButton(R.string.no_edit_dialog_positive_action,null);
AlertDialog noEditDialog = noEditDialogBuilder.create();
noEditDialog.show();
}
else
locationSetting.displayMap(0);
}
return false;
}
});
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
}
}
試試這個,這會幫助你
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
public class Reset extends PreferenceActivity{
private Preference myPreference;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
myPreference = findPreference("reset");
myPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference arg0) {
Builder alertDialog = new AlertDialog.Builder(Reset.this);
alertDialog.setMessage("Reset?");
alertDialog.setCancelable(true);
alertDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
SharedPreferences.Editor editor = settings.edit();
editor.clear();
editor.commit();
} });
alertDialog.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
} });
alertDialog.show();
return false;
}
});
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.