Domanda

Sto cercando di rimuovere una preferenza dallo schermo in modo che non è visibile se l'utente utilizza un maggiore SDK a 2,2. Ho trovato più risposte dicendo che getPreferenceScreen (). RemovePreference (thePreference) funzionerà, ma sto diventando FALSE restituito ogni volta che provo. Sto usando nel posto sbagliato? Qualsiasi indizio dal mio codice?

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);
    }
}
....
}
È stato utile?

Soluzione

Va bene il problema nel mio caso è stato che le mie preferenze sono stati separati in categorie e quando le preferenze sono suddivisi in categorie non si può semplicemente ".removePreference", come stavamo cercando di fare. Ho dovuto prima fare riferimento la categoria contenente la preferenza ho voluto rimuovere e quindi rimuovere la preferenza da quella categoria in questo modo ..

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

I assumere questo ha qualcosa a che fare con la possibilità di avere più preferenze con la stessa chiave (al fine di rimuovere quella corretta). In ogni caso grazie Vladimir per attaccare con me. Sicuramente non avrebbe trovato la risposta senza di te.

Altri suggerimenti

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

//Change language
    setApplicationLanguage();

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

Codice sembra essere di destra. Dirvi che le seguenti opere codice, appena provato:

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

}

E il tuo assegno per sdk costruire? Ha il codice davvero andare sotto la condizione?

E per favore, controllare il nome di vostra preferenza. Può essere che non avete ottenuto con il metodo findPreference.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top