2010-06-10 12 views
24

Tôi đã thực sự đấu tranh thông qua việc này. Mới đối với Java/Android. Tôi đang viết ứng dụng đầu tiên của mình và đây là điều đầu tiên đã khiến tôi mất nhiều thời gian hơn một vài ngày tìm kiếm để tìm ra. Dưới đây là các thiết lập: Đó là một BAC tính/uống truy cập:Làm cách nào để nhận được tùy chọn hoạt động trong Android?

alt text

Một công thức được sử dụng để tính toán BAC. Đây là forumla:

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

Vì vậy, bạn có thể thấy, có thể sửa đổi giới tính và cân nặng sẽ tạo ra kết quả chính xác và được cá nhân hóa hơn. Vì vậy, tôi có chúng như là đôi:

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

Để thay đổi các biến này, tôi muốn người đó có thể đi vào cài đặt và chọn các giá trị khác nhau. Tôi có những thứ này được thiết lập, nhưng không liên quan đến các biến được hiển thị ở trên vì tôi không thể cho cuộc sống của tôi tìm ra cách. Dưới đây là:

alt text

tôi bấm nút menu và điều này bật lên. Tuyệt quá. Tôi sẽ nhấp vào Cài đặt.

alt text

Bây giờ, tùy chọn bật lên. Dưới đây là preferences.xml tôi:

<?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> 

Onward đến ListPreference weight:

alt text

Và đó xuất hiện. Các giá trị được lưu trữ dưới dạng mảng chuỗi trong res/values ​​/ arrays.xml. Đây là một mẫu, chỉ là mẫu, trọng lượng:

<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> 

Điều này về cơ bản là xa như tôi đã nhận được. Tôi có thể nhấp vào một giá trị, chắc chắn, nhưng nó không thay đổi công thức bởi vì nó không liên kết với các đôi tôi tạo ra trong DrinkingBuddy.java. Tất cả các nội dung được hiển thị trong cài đặt chỉ là các vỏ trống bây giờ, bao gồm cả spinner trên bố cục chính (thời gian mặc định chỉ được đặt thành 1 giờ)

Tôi đã tạo Preferences.java và đã thử thực hiện các kết hợp khác nhau mã được tìm thấy trong các hướng dẫn và tài nguyên trên web nhưng không có kết quả. Ở đây nó được dù sao, đầy nỗ lực thất bại trong việc thực hiện beerPref (các thiết lập tùy chọn để thay đổi bao nhiêu ounce trong bia) tương quan với một biến trong lớp học chính của tôi:

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

);} 
} 

Một đầy đủ về hướng dẫn và mẫu mã sẽ được TUYỆT VỜI như tôi chưa tìm thấy bất kỳ hướng dẫn đáng tin cậy ra khỏi đó.

+0

nó có vẻ như bạn có mã vào đây để tiết kiệm một sở thích ... nhưng là của bạn mã cho "công thức" * đọc * từ nơi tùy chọn được lưu? –

+0

Ummm Tôi không nghĩ vậy. Tôi có 2 tệp .java: DrinkingBuddy.java và Preferences.java. Sau đó là bit cuối cùng của mã được hiển thị, trong khi mọi thứ khác nằm trong DrinkingBuddy.java. Một lần nữa, mọi thứ bên dưới dòng "additionalPreferencesFromResource ..." chỉ là một thứ mà tôi đã ném vào đó để cố gắng làm cho nó hoạt động. –

+0

Dưới đây là một số hướng dẫn đã giúp tôi: http://viralpatel.net/blogs/android-preferences-activity-example/ và http://www.brighthub.com/mobile/google-android/articles/116373. aspx – MarkHu

Trả lời

4

Bạn đang yêu cầu có thể hai bộ tệp tùy chọn khác nhau.

Đảm bảo bạn lưu trữ giá trị ListPreference trong cùng một tệp. Bắt đầu lên adb cuộn đến cd /data/data/com.your.package và tìm thư mục và tệp thuộc sở thích loại.

Tôi nghĩ rằng lỗi này là bạn chỉ định một tập tin khác với các thiết lập đã được lưu quá:

Hãy thử thay đổi này:

SharedPreferences preferences = getSharedPreferences(PREF_FILE_NAME, MODE_PRIVATE); 

để

SharedPreferences preferences = PreferenceManager 
       .getDefaultSharedPreferences(context); 

Sau đó, bạn có thể sẽ chỉ phải truy vấn

preferences.getString('weightPref', null); 

Ngoài ra, bạn không cần Trình biên tập. Các tùy chọn được lưu tự động.

+0

Không, tôi nghĩ rằng vấn đề của tôi là cơ bản hơn nhiều. Không có lỗi, chỉ là một thiếu hiểu biết làm thế nào. –

+2

@Dan T Bạn đã kiểm tra những gì tôi đã nói? Điều này rất quan trọng, nếu bạn có hai tệp khác nhau để lưu trữ các tùy chọn không hoạt động tốt. – Pentium10

+0

Có tất cả đều tốt ở đó, tôi đã không thực hiện bất kỳ mã cần thiết nào. Cảm ơn! –

17

tôi vẫn đang làm việc tất cả điều này ra bản thân mình, nhưng (có phần chuyển thể từ phiên bản của tôi) Tôi nghĩ rằng lớp Preferences bạn chỉ cần làm như sau:

public class Preferences extends PreferenceActivity { 

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

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

Sau đó, trong lớp học chính của bạn, bạn có thể tham khảo theo tùy chọn:

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

Việc lưu các cập nhật tùy chọn được xử lý cho bạn.

(Không quá chắc chắn về tuyên bố công khai/riêng!)

+0

Điều này có vẻ tuyệt vời. Tôi sẽ thử ASAP. Cảm ơn bạn! –

+0

Hmmm điều này rất lạ. Tôi đã sử dụng BeerOunces để tôi có thể kiểm tra nó (Tôi có một bánh mì nướng nói rằng "Bạn đã thêm một loại bia x oz"). Bây giờ vấn đề là ... biến giữ giá trị mà tôi chỉ định nó ở đầu (12), nhưng khi nó hiển thị trong bánh mì nướng nó cho thấy giá trị ưu tiên (24). Ngay cả khi tôi thay đổi bản gốc thành BeerOunces; (không có giá trị được chỉ định) nó chỉ là yếu tố vào phương trình như một số không, trong khi bánh mì nướng hiển thị 24. WTHell. –

+0

Tôi không thể thực sự gỡ lỗi ứng dụng của bạn cho bạn :) nhưng tôi nhận ra rằng tôi đã gọi trọng số tùy chọn mà tôi cho là nên có weightPref (hiện đã được sửa) – ChrisV

0

Đối với hầu hết các ứng dụng, nó là thuận nhất để sử dụng sở thích chia sẻ mặc định. Bạn có thể nhận được từ bất cứ nơi nào trong bạn ứng dụng chúng với:

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); 

Bạn có thể lưu biến mới vào nó với:

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