2010-11-02 12 views
14

Estoy tratando de eliminar una preferencia de la pantalla para que no esté visible si el usuario está usando un SDK mayor que 2.2. He encontrado varias respuestas que dicen que getPreferenceScreen(). RemovePreference (thePreference) funcionará, pero me devuelven FALSO cada vez que lo intento. ¿Lo estoy usando en el lugar equivocado? ¿Alguna pista de mi código?Cómo eliminar las preferencias de Android de la pantalla

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); 
    } 
} 
.... 
} 

Respuesta

45

Bien, el problema en mi caso era que mis preferencias estaban separadas en categorías y cuando las preferencias están categorizadas no se puede simplemente "eliminar la referencia" como estábamos tratando de hacer. La primera vez que tenía que hacer referencia a la categoría que contiene la preferencia que quería quitar y eliminar los que la preferencia de esa categoría al igual que ..

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); 
} 
} 
.... 
} 

Asumo que esto tiene algo que ver con la capacidad de tener múltiples preferencias con el mismo clave (para eliminar la correcta). De todos modos, gracias Vladimir por quedarte conmigo. Definitivamente no habría encontrado la respuesta sin ti.

+1

¡Gracias, esto me ha solucionado el problema! ¡Eliminar la preferencia de PreferenceCategory funciona bien! – stealthcopter

+1

Me estaba rascando la cabeza hasta que veo esto, ¡no es de extrañar que todo no funcione después de que agregué PreferenceCategory! Deberían haberlo documentado en alguna parte ... – Bruce

1

El código parece correcto. ¿Le dice que el siguiente código funciona, solo lo probó:

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); 
     } 
    } 
} 

}

¿Qué hay de su cheque para construir SDK? ¿Realmente el código entra en la condición?

Y, por favor, marque el nombre que prefiera. Puede ser que no lo haya obtenido con el método findPreference.

+0

Gracias por su rápida respuesta. Sí, antes de publicar, en realidad tenía el código imprimiendo el resultado de la eliminación (que devuelve un booleano) y me está dando un falso. Eliminé el enunciado if solo para eliminar cualquier variable y también comprobé e intenté distintas preferencias con el mismo resultado. ¿Alguna posibilidad de ver toda la clase con la que la probaste? No tengo idea de por qué no funciona para mí. – honeal

+0

Editado la respuesta. –

+0

Gracias amigo, ayudado toneladas. No tenía manera de saber exactamente qué estaba pasando sin ver mi XML primero. Gracias de nuevo. Promovería su respuesta si estuviera por encima de 15. – honeal

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

//Change language 
    setApplicationLanguage(); 

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