我正在尝试从屏幕中删除首选项,因此如果用户使用大于2.2的SDK,则不会显示该首选项。我发现有几个答案说getPreferenceScreen()。removePreference(thePreference)会起作用,但每次尝试都会返回FALSE。我在错误的地方使用它吗?我代码中的任何线索?
public class Preferences extends PreferenceActivity implements OnSharedPreferenceChangeListener {
private static final String POLLING_PREFERENCE = "update_frequency_list";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
// Get a reference to the preferences
mPollPref = getPreferenceScreen().findPreference(POLLING_PREFERENCE);
//If the SDK is 2.2 or greater do not display polling preferences (using C2DM instead)
if(Build.VERSION.SDK_INT > 7) {
getPreferenceScreen().removePreference(mPollPref);
}
}
....
}
答案 0 :(得分:48)
好的问题在于我的情况是我的偏好被分成了几个类别,当偏好被分类时,你不能像我们试图做的那样简单地“.removePreference”。我首先必须引用包含我想删除的首选项的类别,然后从该类别中删除该首选项,如此...
public class Preferences extends PreferenceActivity implements OnSharedPreferenceChangeListener {
private static final String POLLING_PREFERENCE = "update_frequency_list";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
// Get a reference to the preferences
mPollPref = getPreferenceScreen().findPreference(POLLING_PREFERENCE);
//If the SDK is 2.2 or greater do not display polling preferences (using C2DM instead)
if(Build.VERSION.SDK_INT > 7) {
PreferenceCategory notificationsCategory = (PreferenceCategory) findPreference("notifications_category");
notificationsCategory.removePreference(mPollPref);
}
}
....
}
我认为这与使用相同的密钥具有多个首选项的能力有关(为了删除正确的密钥)。无论如何,谢谢你弗拉基米尔坚持我。没有你,肯定不会找到答案。
答案 1 :(得分:5)
//remove all preferences
mPollPref = getPreferenceScreen();
mPollPref.removeAll();
//Change language
setApplicationLanguage();
//and rebuild
addPreferencesFromResource(R.xml.preferences);
答案 2 :(得分:1)
代码似乎是正确的。告诉您以下代码有效,只是测试了它:
package com.lid.ps.screens.edit_activity;
import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.preference.*;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.*;
import com.lid.ps.bean.AbstractData;
import com.lid.ps.bean.Action;
import com.lid.ps.bean.ActionFactory;
import com.lid.ps.bean.CommonAlertDialog;
import com.lid.ps.bean.utils.DateTools;
import com.lid.ps.model.Activity;
import com.lid.ps.model.ActivityImpl;
import com.lid.ps.screens.R;
import java.util.Calendar;
/**
* User: Vladimir Ivanov
* Date: 04.07.2010
* Time: 9:58:17
*/
public class EditActivityScreen extends PreferenceActivity
implements DatePickerDialog.OnDateSetListener, AbstractData<Activity> {
private static final int MENU_DELETE_ACTIVITY = 0;
private boolean create = true;
public boolean isCreate() {
return create;
}
private Activity dataContainer;
private EditTextPreference activityNamePref;
private EditTextPreference activityDescPref;
private Preference startDatePref;
private CheckBoxPreference hiddenPref;
private int year;
private int monthOfYear;
private int dayOfMonth;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.activity_prefs);
//this.setContentView(R.layout.edit_screen);
activityNamePref = (EditTextPreference) findPreference("name");
activityDescPref = (EditTextPreference) findPreference("desc");
// We have to do this to get the save/cancel buttons to highlight on
// their own.
getListView().setItemsCanFocus(true);
// Grab the content view so we can modify it.
FrameLayout content = (FrameLayout) getWindow().getDecorView()
.findViewById(android.R.id.content);
// Get the main ListView and remove it from the content view.
ListView lv = getListView();
content.removeView(lv);
// Create the new LinearLayout that will become the content view and
// make it vertical.
LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);
// Have the ListView expand to fill the screen minus the save/cancel
// buttons.
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
lp.weight = 1;
ll.addView(lv, lp);
// Inflate the buttons onto the LinearLayout.
View v = LayoutInflater.from(this).inflate(
R.layout.edit_screen, ll);
startDatePref = findPreference("time");
hiddenPref = (CheckBoxPreference) findPreference("hidden");
// Initialize buttons
Button cancelButton = (Button) v.findViewById(R.id.cancel_activity);
Button saveButton = (Button) v.findViewById(R.id.save_activity);
cancelButton.setOnClickListener(new CancelOnClickListener());
saveButton.setOnClickListener(new SaveOnClickListener());
setContentView(ll);
// if edit mode...
if (getIntent() != null && getIntent().getExtras() != null) {
// some stuff
}
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
Preference preference) {
if (preference == startDatePref) {
new DatePickerDialog(this, this, year, monthOfYear, dayOfMonth).show();
}
return super.onPreferenceTreeClick(preferenceScreen, preference);
}
private void popAlarmSetToast(Context context) {
String toastText;
//...
final Toast toast = Toast.makeText(context, toastText, Toast.LENGTH_LONG);
toast.show();
}
/**
* updates the preference summary.
*
* @param datePicker date picker
* @param i year
* @param i1 month
* @param i2 day
*/
@Override
public void onDateSet(DatePicker datePicker, int i, int i1, int i2) {
year = i;
monthOfYear = i1;
dayOfMonth = i2;
updateDate();
}
private void updateDate() {
startDatePref.setSummary(
new StringBuilder()
// Month is 0 based so add 1
.append(year).append("-")
.append(monthOfYear + 1).append("-")
.append(dayOfMonth).append(" "));
}
private class CancelOnClickListener implements View.OnClickListener {
public void onClick(View view) {
// go back to the previous page
final Action action = ActionFactory.createAction("back_edit_activity");
if (action != null) {
action.doAction(EditActivityScreen.this);
}
}
}
private class SaveOnClickListener implements View.OnClickListener {
public void onClick(View view) {
// validation
if (activityNamePref.getSummary() == null || activityNamePref.getSummary().length() == 0) {
AlertDialog dialog = new AlertDialog.Builder(EditActivityScreen.this).create();
dialog.setTitle(R.string.validation_failed);
dialog.setMessage(EditActivityScreen.this.getResources().getString(R.string.activity_create_fail));
dialog.setButton(AlertDialog.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
dialog.show();
} else {
final Action action = ActionFactory.createAction("save_edit_activity");
if (action != null) {
action.doAction(EditActivityScreen.this);
}
popAlarmSetToast(EditActivityScreen.this);
}
}
}
}
您对sdk构建的检查怎么样?代码真的不符合条件吗?
请检查您的偏好名称。可能是你没有用findPreference
方法得到它。