如何从屏幕中删除Android偏好设置
问题描述:
我试图从屏幕中删除偏好设置,以便在用户使用的SDK大于2.2时不可见。我发现了几个答案,说getPreferenceScreen()。removePreference(thePreference)会工作,但我每次尝试时都会返回FALSE。我是否在错误的地方使用它?我的代码的任何线索?如何从屏幕中删除Android偏好设置
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);
}
}
....
}
答
好的问题在我的情况是,我的喜好被分为几类,当偏好被分类时,你不能简单地“.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);
}
}
....
}
我想这已经是与以具有相同的多个偏好的能力键(为了删除正确的)。无论如何谢谢弗拉基米尔坚持与我。没有你,肯定不会找到答案。
答
代码似乎是正确的。告诉你,下面的代码工作,只是测试它:
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
方法得到它。
答
//remove all preferences
mPollPref = getPreferenceScreen();
mPollPref.removeAll();
//Change language
setApplicationLanguage();
//and rebuild
addPreferencesFromResource(R.xml.preferences);
谢谢你解决了我的问题!从PreferenceCategory中移除偏好效果很好! – stealthcopter 2011-01-30 22:17:24
抓我的头,直到我看到这个,难怪一切都失败后,我添加PreferenceCategory!他们应该在某处记录下来.. – Bruce 2013-12-09 13:29:13