Reputation: 123
I have defined some SharedPreferences in my Main Activity (called ScoreboardActivity). The values are definitely either getting retrieved or the correct default value is working. However, I have now tried to setup a SettingsActivity
screen so that the user can change these values and it isn't working correctly. When the new Activity is opening, the values aren't loading into the fields in the XML layout.
(as you will be able to tell, I'm very new to this so please be kind)
Here is my ScoreboardActivity code related to the Shared Preferences (this works):
// 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);
}
Here is my 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) );
}
}
Here is my XML Layout:
<?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" />
Upvotes: 0
Views: 604
Reputation: 123
@Eric & @Adil Soomro - Thank you for your comments. You have put me on the right track and I have discovered how to accomplish the retrieving of the SharedPreferences in my SettingsActivity.
Here is my altered code for anyone that might be interested in the future...
Main Activity code retrieving the initial values:
// 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 );
The onOptionsItemSelected method:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Intent intent = new Intent(this, SettingsActivity.class);
startActivity(intent);
return super.onOptionsItemSelected(item);
}
The SettingsActivity class:
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) );
}
}
Upvotes: 0
Reputation: 37729
You should really learn basics of android first.
The way you are instantiating ScoreboardActivity
is not the android's way of instantiation of Activity
.
In your code, I didn't find any code related to SAVING DATA to SharedPreferences
. the code you put there is only for retrieving data from SharedPreferences
in both classes.
and when you change values using UI components, like changing the CheckBox state, changing the text in EditText etc, you need to save them again to SharedPreferences while you are finalizing the value (asking user to save or finishing current Activity).
I would suggest you to read some basics of android-sdk.
SharedPreferences
Activity
.
(switching between Activities)Upvotes: 1