2012-12-31 68 views
0

我在主活動中定義了一些SharedPreferences(稱爲ScoreboardActivity)。值肯定是檢索或正確的默認值正在工作。但是,我現在試圖設置一個SettingsActivity屏幕,以便用戶可以更改這些值並且它無法正常工作。當新的Activity打開時,值不會加載到XML佈局中的字段中。檢索SharedPreferences在我的設置活動中不起作用

(因爲你將能夠告訴,我是很新,所以請善待)

這裏是與共享偏好(這工作)我ScoreboardActivity代碼:

// get the preferences 
     prefs = getPreferences(MODE_PRIVATE); 

     // Load the values or defaults from the SharedPreferences 
     msMainClockStart = prefs.getLong("Default_Main_Clock", 480000); // 8 minute default 
     useShotClock = prefs.getBoolean("Use_ShotClock", false); 
     msShotClockStart = prefs.getLong("Default_Shot_Clock", 24000);  // 24 second default 
     tvPeriodPrefix = prefs.getString("Period_Prefix", getResources().getString(R.string.period)); 
     valMaxPeriods = prefs.getInt("Max_Periods", 4); 


Here is my code when the menu button is pressed and Settings is clicked on (I think this is wrong but the settings.xml page does open: 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     setContentView(R.layout.settings); 

     return super.onOptionsItemSelected(item); 
    } 

這裏是我的SettingsActivity:

package com.example.ultimatescoreclock; 

    import android.app.Activity; 
    import android.content.SharedPreferences; 
    import android.os.Bundle; 
    import android.widget.CheckBox; 
    import android.widget.EditText; 

    public class SettingsActivity extends Activity { 

    ScoreboardActivity scoreboard = new ScoreboardActivity(); 
    SharedPreferences settings = scoreboard.prefs; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     EditText 
      strMainMinutes, 
      strShotSeconds, 
      strPeriodPrefix, 
      strMaxPeriods; 

     CheckBox 
      cbUseShotClock; 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.settings); 

     // Load the values or defaults from the SharedPreferences 
     scoreboard.msMainClockStart = settings.getLong("Default_Main_Clock", 480000); // 8 minute default 
     scoreboard.useShotClock = settings.getBoolean("Use_ShotClock", true); 
     scoreboard.msShotClockStart = settings.getLong("Default_Shot_Clock", 24000);  // 24 second default 
     scoreboard.tvPeriodPrefix = settings.getString("Period_Prefix", getResources().getString(R.string.period)); 
     scoreboard.valMaxPeriods = settings.getInt("Max_Periods", 4); 

     strMainMinutes = (EditText) findViewById(R.id.numMainMinutes); 
     cbUseShotClock = (CheckBox) findViewById(R.id.cbUseShotClock); 
     strShotSeconds = (EditText) findViewById(R.id.numShotSeconds); 
     strPeriodPrefix = (EditText) findViewById(R.id.periodPrefix); 
     strMaxPeriods = (EditText) findViewById(R.id.periodMax); 


     strMainMinutes.setText(Long.toString(scoreboard.msMainClockStart/1000)); 
     cbUseShotClock.setChecked(scoreboard.useShotClock); 
     strShotSeconds.setText(Long.toString(scoreboard.msShotClockStart/1000)); 
     strPeriodPrefix.setText(scoreboard.tvPeriodPrefix); 
     strMaxPeriods.setText(Integer.toString(scoreboard.valMaxPeriods)); 
    } 


} 

這是我的XML佈局:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 

<TextView 
    android:id="@+id/lblMainClock" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="Main Clock Default (mins)" /> 

<EditText 
    android:id="@+id/numMainMinutes" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_weight="1" 
    android:ems="10" 
    android:inputType="number" 
    android:minEms="4" /> 

<CheckBox 
    android:id="@+id/cbUseShotClock" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:gravity="center_vertical|start" 
    android:text="Use Shot Clock" /> 

<TextView 
    android:id="@+id/lblShotClock" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Shot Clock Default (secs)" /> 

<EditText 
    android:id="@+id/numShotSeconds" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_weight="1" 
    android:ems="10" 
    android:inputType="number" 
    android:minEms="4" > 

    <requestFocus /> 
</EditText> 

<TextView 
    android:id="@+id/lblPeriodPrefix" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Period Prefix (e.g. Q, Shift, etc)" /> 

<EditText 
    android:id="@+id/periodPrefix" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:ems="10" /> 

<TextView 
    android:id="@+id/lblMaxPeriods" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Maximum Number of Periods" /> 

<EditText 
    android:id="@+id/periodMax" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:minEms="4" /> 

+1

A(可能)的相關注意事項:你爲什麼使用'new ScoreboardActivity()'實例化一個活動? – Eric

+0

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); //然後你使用 prefs.getBoolean(「keystring」,true);你應該使用上面的行..根據字符串和布爾值。 – itsrajesh4uguys

+0

@Eric - 因爲我很新,想弄明白這一點。我幾乎沒有面向對象的經驗。變量msMainClockStart,useShotClock(etc)都在ScoreboardActivity中定義。沒有實例化ScoreboardActivity,Eclipse沒有識別變量。有什麼更好的方法來做到這一點? –

回答

1

你真該學學Android首次的基礎。

您實例化的方式不是Android的實例化方式Activity

在您的代碼中,我沒有找到任何與保存數據SharedPreferences相關的代碼。您放在那裏的代碼僅用於從兩個類中的SharedPreferences中檢索數據。

當您更改使用UI組件的值時,如更改CheckBox狀態,更改EditText等中的文本,您需要在最終確定值時詢問SharedPreferences(要求用戶保存或結束當前活動) 。

我建議你閱讀一些android-sdk的基礎知識。

  • Here是節約和SharedPreferences
  • Here檢索 數據有關如何啓動Activity一個Android教程一些例子和說明。 (在活動之間切換)
+0

感謝您的教程,我一定會閱讀它們。我建立這個應用程序的原因是「學習Android的基礎知識」。我也在這些論壇上學習。當我不明白某些東西或不起作用時,我已經閱讀並且正在學習,並前往論壇。我首先搜索答案,但如果你不知道要搜索什麼,它們並不總是很容易找到。 SharedPreferences通過搜索找到。另外,我知道我還沒有任何數據保存方法。但是,如果我不能讓它出現在屏幕上,就沒有辦法保存數據。 –

+0

@JimThornton:正確,但是如何在不保存前從'SharedPreferences'獲取數據。這樣你只會得到空值或fase布爾值。 –

+0

從get方法中設置的默認值。例如,'getBoolean(「Use_Shot_Clock」,false);'會默認爲false(根據我的理解,所以我的想法是(對於新的安裝)他們會啓動應用程序並設置默認值。 (一旦我添加了save方法),那麼將創建XML首選項文件,然後下一次它將檢索保存的值而不是默認值。我想如果我在代碼的開頭創建一個保存方法,它會覆蓋(僞代碼) –

0

@Eric & @Adil Soomro - 感謝您的意見。你已經把我放在了正確的軌道上,並且我發現瞭如何在SettingsActivity中完成對SharedPreferences的檢索。

以下是我對未來感興趣的任何人的更改代碼...

主要活動代碼檢索初始值:

// get the preferences 
    prefs = getPreferences(MODE_PRIVATE); 

    // Load the values or defaults from the SharedPreferences 
    msMainClockStart = prefs.getLong("Default_Main_Clock", DEFAULT_MAIN_CLOCK_START); 
    useShotClock = prefs.getBoolean("Use_ShotClock", DEFAULT_USE_SHOT_CLOCK); 
    msShotClockStart = prefs.getLong("Default_Shot_Clock", DEFAULT_SHOT_CLOCK_START); 
    tvPeriodPrefix = prefs.getString("Period_Prefix", DEFAULT_PERIOD_PREFIX); 
    valMaxPeriods = prefs.getInt("Max_Periods", DEFAULT_PERIOD_MAX); 

的onOptionsItemSelected方法:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    Intent intent = new Intent(this, SettingsActivity.class);  
    startActivity(intent); 

    return super.onOptionsItemSelected(item); 
} 

的SettingsActivity類:

package com.example.ultimatescoreclock; 

import android.app.Activity; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.widget.CheckBox; 
import android.widget.EditText; 

public class SettingsActivity extends Activity { 

EditText 
    strMainMinutes, 
    strShotSeconds, 
    strPeriodPrefix, 
    strMaxPeriods; 

long 
    msMainClockStart, 
    msShotClockStart; 

int valMaxPeriods; 

CheckBox cbUseShotClock; 

SharedPreferences prefs; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.settings); 

    // get the Shared Preferences 
    prefs = getPreferences(MODE_PRIVATE); 

    // assign the views 
    strMainMinutes = (EditText) findViewById(R.id.numMainMinutes); 
    cbUseShotClock = (CheckBox) findViewById(R.id.cbUseShotClock); 
    strShotSeconds = (EditText) findViewById(R.id.numShotSeconds); 
    strPeriodPrefix = (EditText) findViewById(R.id.periodPrefix); 
    strMaxPeriods = (EditText) findViewById(R.id.periodMax); 

    // Load the values or defaults from the SharedPreferences 
    msMainClockStart = prefs.getLong("Default_Main_Clock", DEFAULT_MAIN_CLOCK_START); 
    cbUseShotClock.setChecked(prefs.getBoolean("Use_ShotClock", DEFAULT_USE_SHOT_CLOCK)); 
    msShotClockStart = prefs.getLong("Default_Shot_Clock", DEFAULT_SHOT_CLOCK_START); 
    strPeriodPrefix.setText(prefs.getString("Period_Prefix", DEFAULT_PERIOD_PREFIX)); 
    valMaxPeriods = prefs.getInt("Max_Periods", DEFAULT_PERIOD_MAX); 

    // convert the values that need converting 
    strMainMinutes.setText(Long.toString(msMainClockStart/60000)); 
    strShotSeconds.setText(Long.toString(msShotClockStart/1000)); 
    strMaxPeriods.setText(Integer.toString(valMaxPeriods)); 

} 

} 
相關問題