Я не могу понять, как использовать Android PreferenceActivity - PullRequest
4 голосов
/ 26 января 2011

Я пытался использовать действие по настройке Android, у меня все настроено, но у меня возникли проблемы с получением пользовательских настроек.Если быть точным, это два параметра edittext, длина термина и длина года, которые я хочу получить в виде значений типа int, чтобы я мог использовать их в расчете в другой деятельности.

Каждый найденный мной пример отличается, и яне могу найти четкого объяснения.Я опубликую класс и метод, который я использую ниже, я знаю, что код там неправильный, но я чувствую, что я все время возился с ним и не могу понять.Эта строка, в частности, я не верю, является правильной: SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); и я не совсем понимаю предпочтительные действия в целом, они, кажется, не работают так, как я ожидал.Любой совет был бы действительно хорош!Я жонглировал одними и теми же строками кода уже несколько дней.
Спасибо.

Моя активность по настройкам выглядит следующим образом:

package com.geistware.studentbudgetapp;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.EditTextPreference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
import android.text.method.DigitsKeyListener;
import android.util.Log;

public class UserPrefs extends PreferenceActivity {
    public int termLength = 1;
    public int yearLength = 1;

    @Override //OnCreate never runs, why?
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.setup); 

        EditTextPreference usersTermLength =(EditTextPreference)
        findPreference(getString(R.string.term_length_set)); //finds 
        //the edittext box by its key, term_length_set
        usersTermLength.getEditText().setKeyListener(DigitsKeyListener.
            getInstance()); //DigitsKeyListener only allows digits to be typed in
        Log.v("UserPrefs", "UsersTermLength: " + usersTermLength);

        EditTextPreference usersYearLength =(EditTextPreference)
            findPreference(getString(R.string.year_length_set));
        usersYearLength.getEditText().setKeyListener(DigitsKeyListener.
            getInstance());
    }
}

, и я хочу иметь возможность получать пользователей termLength и yearLength (в виде целых чисел) в этом методе:

public float alterForFrequency(float enteredAmount, String spinnerPosition){
    //get user preferences (not working)
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);

    String termKey = getString(R.string.term_length_set, "");
    String yearKey = getString(R.string.year_length_set, "");

    int termLength = prefs.getInt(termKey, 1);
    int yearLength = prefs.getInt(yearKey, 1);

    Log.v("alterForFrequency", "userprefs: " + termLength + yearLength);

    //perform calculations for monthly/temly/yearly
    if(spinnerPosition.equals("Monthly")){
        usersAmount = ((enteredAmount / 31)* 7);
        Log.v("FiscFreq", "revisingAmount=" + usersAmount);
    }
    else if(spinnerPosition.equals("Termly")){
        usersAmount = (enteredAmount / termLength);
        Log.v("FiscFreq", "revisingAmount=" + usersAmount);
    }
    else if(spinnerPosition.equals("Yearly")){
        usersAmount = (enteredAmount / yearLength);
    }
    else{
        usersAmount = enteredAmount;
    }

    currencyRevisedAmount = toCurrency(usersAmount); //drops the unwanted digits
    return currencyRevisedAmount;
}

Я на самом деле создаю экземпляр FiscalFrequency для использования alterForFrequency в действии под названием Keypad, например:

public class Keypad extends Activity { .....
   public float reviseOnSpinnerPos(){
    enteredAmount = Float.valueOf(userAmount.getText().toString());
    FiscalFrequency ff = new FiscalFrequency();
    revisedAmount = ff.alterForFrequency(enteredAmount, spinnerPosition);
    return revisedAmount;
    }
}

Ответы [ 2 ]

4 голосов
/ 26 января 2011

getDefaultSharedPreferences (Context) принимает экземпляр Context (как он говорит), и то, что вы предоставляете, не является контекстом. Если ваш класс FiscalFrequency находится в активности и не является статичным, попробуйте вызвать

getDefaultSharedPreferences(UserPrefs.this)

Или какой бы деятельностью вы ни занимались в данный момент (поскольку активность расширяет контекст)

В противном случае укажите экземпляр Context при создании экземпляра вашего класса FiscalFrequency. Один из способов - сделать это через конструктор.

P.S. Было бы проще, если бы вы опубликовали часть кода, где вы создаете экземпляр FiscalFrequency и активность, где это происходит.

EDIT: В вашем классе FiscalFrequency выполните следующее:

public class FiscalFrequency {
    public FiscalFrequency(final Context context) {
        this.context = context;
    }
    private Context context;
    ... the rest of your class ...
}

И тогда вы можете создать экземпляр вашей FiscalFrequency только при предоставлении ему контекста.

FiscalFrequency ff = new FiscalFrequency(this);

(«this» является ссылкой на класс, в котором мы сейчас находимся, и этот класс в вашем случае - Activity, а Activity - это контекст.

И, наконец, в вашем alterForFrequency () выполните:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);

"context" - это ссылка на Context (ваш класс активности в вашем случае), который вы указали при создании экземпляра FiscalFrequency.

1 голос
/ 26 января 2011

Попробуйте добавить прослушиватель в нижней части метода onCreate в классе UserPrefs:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
prefs.registerOnSharedPreferenceChangeListener(this);

Это приведет к изменению настроек на лету, когда пользователь изменит значения.

...