Как убрать настройки Android с экрана - PullRequest
14 голосов
/ 02 ноября 2010

Я пытаюсь удалить настройки с экрана, чтобы они не отображались, если пользователь использует SDK больше 2.2. Я нашел несколько ответов о том, что 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 ]

48 голосов
/ 03 ноября 2010

Хорошо, проблема в моем случае заключалась в том, что мои предпочтения были разделены на категории, и когда предпочтения распределены по категориям, вы не можете просто «.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);
}  
}  
....  
}

Я предполагаю, что это как-то связано с возможностью иметь несколько предпочтений стот же ключ (для того, чтобы удалить правильный).В любом случае спасибо Владимиру за то, что он остался со мной.Определенно не нашел бы ответ без тебя.

5 голосов
/ 07 марта 2012
//remove all preferences
    mPollPref = getPreferenceScreen();
    mPollPref.removeAll();

//Change language
    setApplicationLanguage();

//and rebuild
    addPreferencesFromResource(R.xml.preferences);
1 голос
/ 02 ноября 2010

Код кажется правильным.Скажите, что работает следующий код, только что проверил:

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 методом.

...