如何从屏幕中删除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); 
} 
} 
.... 
} 

我想这已经是与以具有相同的多个偏好的能力键(为了删除正确的)。无论如何谢谢弗拉基米尔坚持与我。没有你,肯定不会找到答案。

+1

谢谢你解决了我的问题!从PreferenceCategory中移除偏好效果很好! – stealthcopter 2011-01-30 22:17:24

+1

抓我的头,直到我看到这个,难怪一切都失败后,我添加PreferenceCategory!他们应该在某处记录下来.. – Bruce 2013-12-09 13:29:13

代码似乎是正确的。告诉你,下面的代码工作,只是测试它:

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

+0

感谢您的快速响应。是的,在发布之前,我实际上有代码打印删除的结果(它返回一个布尔值),它给了我一个错误。为了消除任何变量,我删除了if语句,并且还检查了不同的首选项,并尝试了相同的结果。任何机会我都能看到你的整个班级,你测试过吗?我不知道为什么它不适合我。 – honeal 2010-11-02 20:59:09

+0

编辑答案。 – 2010-11-03 07:56:42

+0

谢谢兄弟,帮助吨。如果不先看到我的XML,你无法知道究竟发生了什么。再次感谢。我会促进你的答案,如果我高于15. – honeal 2010-11-03 15:51:59

//remove all preferences 
    mPollPref = getPreferenceScreen(); 
    mPollPref.removeAll(); 

//Change language 
    setApplicationLanguage(); 

//and rebuild 
    addPreferencesFromResource(R.xml.preferences);