如何从屏幕上删除Android偏好设置

时间:2010-11-02 19:49:00

标签: android android-preferences

我正在尝试从屏幕中删除首选项,因此如果用户使用大于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);
    }
}
....
}

3 个答案:

答案 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方法得到它。