web-dev-qa-db-ja.com

Androidで設定を機能させるにはどうすればよいですか?

私はこれを本当に苦労してきました。 Java/Androidの新機能。私は最初のアプリを書いています。これが、数日間検索して理解するのにかかった最初のことです。これが設定です:BAC計算機/ドリンクカウンターです:

alt text

BACの計算には式が使用されます。ここにフォーラムラがあります:

Bac = ((StandardDrinks / 2) * (GenderConstant / Weight)) - (0.017 * Hours);

ご覧のとおり、性別と体重を変更できると、より正確でパーソナライズされた結果が得られます。だから私はそれらをダブルスとして持っています:

double GenderConstant = 7.5; //9 for female
double Weight = 180;

これらの変数を変更するには、その人が設定に移動して別の値を選択できるようにしたいと思います。私はこれらのものをセットアップしましたが、上に示した変数にリンクしていません。なぜなら、私は自分の人生ではどのようにしているかを理解できないからです。どうぞ:

alt text

メニューボタンを押すとポップアップします。すごい。 「設定」をクリックします。

alt text

設定がポップアップします。これが私のpreferences.xmlです:

<?xml version="1.0" encoding="utf-8"?>
 <PreferenceScreen xmlns:Android="http://schemas.Android.com/apk/res/Android">

 <PreferenceCategory Android:title="Personal Settings">


 <ListPreference
 Android:title="Gender"
 Android:summary="Verify or deny the presence of a Y chromosome."
 Android:key="genderPref"
 Android:defaultValue="male"
 Android:entries="@array/genderArray"
 Android:entryValues="@array/genderValues" />

 <ListPreference
 Android:title="Weight"
 Android:summary="How much the planet pulls on you, in pounds."
 Android:key="weightPref"
 Android:defaultValue="180"
 Android:entries="@array/weightArray"
 Android:entryValues="@array/weightValues" />

 </PreferenceCategory>

<PreferenceCategory Android:title="Drink Settings">

 <ListPreference
 Android:title="Beer Size"
 Android:summary="The volume of your beer, in ounces."
 Android:key="beerPref"
 Android:defaultValue="12"
 Android:entries="@array/beerArray"
 Android:entryValues="@array/beerValues" />

 <ListPreference
 Android:title="Shot Size"
 Android:summary="The volume of your shot, in ounces."
 Android:key="shotPref"
 Android:defaultValue="1.5"
 Android:entries="@array/shotArray"
 Android:entryValues="@array/shotValues" />

 <ListPreference
 Android:title="Wine Size"
 Android:summary="The volume of your wine, in ounces."
 Android:key="winePref"
 Android:defaultValue="5"
 Android:entries="@array/wineArray"
 Android:entryValues="@array/wineValues" />


 </PreferenceCategory>
 </PreferenceScreen>

重みのListPreferenceに向けて:

alt text

そしてそれが現れる。値はres/values/arrays.xmlに文字列配列として保存されます。これは重量のサンプルです。

<string-array name="weightArray">
<item>120 lbs</item>
<item>150 lbs</item>
<item>180 lbs</item>
<item>210 lbs</item>
<item>240 lbs</item>
<item>270 lbs</item>
 </string-array>
 <string-array name="weightValues">
<item>120</item>
<item>150</item>
<item>180</item>
<item>210</item>
<item>240</item>
<item>270</item>
 </string-array>

これは基本的に私が得た限りです。確かに値をクリックすることはできますが、DrinkingBuddy.Javaで作成したdoubleとリンクされていないため、式は変更されません。設定に表示されるものはすべて、現時点では空のシェルであり、メインレイアウトのスピナーを含みます(デフォルトの時間は1時間に設定されています)

私はPreferences.Javaを作成し、チュートリアルやWeb上のリソースにあるコードのさまざまな組み合わせを実装しようとしましたが、役に立ちませんでした。とにかく、それはbeerPref(ビールのオンス数を変更する設定オプション)を私のメインクラスの変数と相関させるための失敗した試行で満たされています。

package com.dantoth.drinkingbuddy;


 import Android.app.Activity;
 import Android.content.SharedPreferences;
 import Android.os.Bundle;
 import Android.preference.Preference;
 import Android.preference.PreferenceActivity;
 import Android.preference.Preference.OnPreferenceClickListener;


 public class Preferences extends PreferenceActivity {

public static final String PREF_BEER_SIZE = "PREF_BEER_SIZE";

@Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 addPreferencesFromResource(R.xml.preferences);

 //Get the custom preference



 Preference beerPref = (Preference) findPreference("beerPref");
 beerPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {

 public boolean onPreferenceClick(Preference preference) {

 SharedPreferences customSharedPreference = getSharedPreferences("myCustomSharedPrefs", Activity.MODE_PRIVATE);
 SharedPreferences.Editor editor = customSharedPreference.edit();

 editor.commit();
 return true;
 }}

 );}
 }

完全なチュートリアルとサンプルコードは、信頼できるガイドをまだ見つけていないので、すばらしいでしょう。

24
Dan T

私はまだ自分でこれをすべて取り組んでいますが、(私のバージョンから多少変更されています)Preferencesクラスで必要なことは次のとおりです。

public class Preferences extends PreferenceActivity {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // load the XML preferences file
        addPreferencesFromResource(R.xml.preferences);
    }
}

次に、メインクラスで、設定を参照できます。

public class DrinkingBuddy extends Activity 
                           implements OnSharedPreferenceChangeListener {

    private int weight;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);

        // register preference change listener
        prefs.registerOnSharedPreferenceChangeListener(this);

        // and set remembered preferences
        weight = Integer.parseInt((prefs.getString("weightPref", "120")));
        // etc
    }

    // handle updates to preferences
    public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
        if (key.equals("weightValues")) {
            weight = Integer.parseInt((prefs.getString("weightPref", "120")));
        }
        // etc
    }
}

設定の更新の保存はあなたのために処理されます。

(パブリック/プライベート宣言についてはあまりわかりません!)

17
ChrisV

おそらく2つの異なる設定ファイルのセットを要求しています。

ListPreference値を同じファイルに保存してください。スタートアップadbロールcd /data/data/com.your.packageで、タイプ設定のフォルダとファイルを探します。

設定が保存されているファイルとは異なるファイルを指定したことがバグだと思います。

これを変更してみてください:

SharedPreferences preferences = getSharedPreferences(PREF_FILE_NAME, MODE_PRIVATE);

SharedPreferences preferences = PreferenceManager
                .getDefaultSharedPreferences(context);

次に、おそらくクエリのみを行う必要があります

preferences.getString('weightPref', null);

また、あなたはエディタは必要ありませんです。設定は自動的に保存されます。

4
Pentium10

ほとんどのアプリでは、デフォルトの共有設定を使用するのが最も便利です。アプリ内のどこからでも、次の方法で取得できます。

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);

新しい変数をそれに保存することができます:

sp.edit().putString("var_name", "var value".apply();
0
oabarca