Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences
Feb 23, 2016
Mobile ProgrammingLecture 7
Dialogs, Menus, and SharedPreferences
Agenda
• Dialogs
• Menus
• SharedPreferences
Android Application Components
1. Activity
2. Broadcast Receiver
3. Content Provider
4. Service
Dialogs
• A dialog is a small window that appears in front of the current Activity
• It causes the Activity to lose focus
• Used for ProgressBars, Alerts, etc
Dialogs
• onCreateDialog() is called the first time.
• onPrepareDialog is called every time its opened.o without this, it will remain the same as the first time it
was opened
Dialogs - AlertDialog
• an AlertDialog is an extension of the Dialog class
• it is capable of constructing most dialog user interfaces and is the suggested dialog type
Dialogs - AlertDialog
• you should use it for dialogs that use any of the following features
o a titleo a text messageo one, two, or three buttonso a list of selectable items (with optional checkboxes
or radio buttons)
Dialogs - Creating an AlertDialogpublic class MyDialogs extends Activity {
static final int DIALOG_EXIT_ID = 1;
@Override protected Dialog onCreateDialog(int id) {
Dialog dialog = null;
switch(id) { case DIALOG_EXIT_ID:
AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Do you want to exit?"); builder.setCancelable(true); builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { AlertDialogExample.this.finish(); } });
dialog = builder.create();break;
}
return dialog;}
}
Dialogs - Creating an AlertDialogpublic class MyDialogs extends Activity {
static final int DIALOG_EXIT_ID = 1;
@Override protected Dialog onCreateDialog(int id) {
Dialog dialog = null;
switch(id) { case DIALOG_EXIT_ID:
AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Do you want to exit?"); builder.setCancelable(true); builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { AlertDialogExample.this.finish(); } });
dialog = builder.create();break;
}
return dialog;}
}
Nothing special here, just an int I use to identify the dialog, because we can have more than one
Dialogs - Creating an AlertDialogpublic class MyDialogs extends Activity {
static final int DIALOG_EXIT_ID = 1;
@Override protected Dialog onCreateDialog(int id) {
Dialog dialog = null;
switch(id) { case DIALOG_EXIT_ID:
AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Do you want to exit?"); builder.setCancelable(true); builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { AlertDialogExample.this.finish(); } });
dialog = builder.create();break;
}
return dialog;}
}
Override this method of Activity, which is called when you want to show any dialog of the Activity
Dialogs - Creating an AlertDialogpublic class MyDialogs extends Activity {
static final int DIALOG_EXIT_ID = 1;
@Override protected Dialog onCreateDialog(int id) {
Dialog dialog = null;
switch(id) { case DIALOG_EXIT_ID:
AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Do you want to exit?"); builder.setCancelable(true); builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { AlertDialogExample.this.finish(); } });
dialog = builder.create();break;
}
return dialog;}
}
Switch because we can have more than one dialog, meaning we need to check the dialog id
Dialogs - Creating an AlertDialogpublic class MyDialogs extends Activity {
static final int DIALOG_EXIT_ID = 1;
@Override protected Dialog onCreateDialog(int id) {
Dialog dialog = null;
switch(id) { case DIALOG_EXIT_ID:
AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Do you want to exit?"); builder.setCancelable(true); builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { AlertDialogExample.this.finish(); } });
dialog = builder.create();break;
}
return dialog;}
}
If you want an AlertDialog, you need to build one first
Dialogs - Creating an AlertDialogpublic class MyDialogs extends Activity {
static final int DIALOG_EXIT_ID = 1;
@Override protected Dialog onCreateDialog(int id) {
Dialog dialog = null;
switch(id) { case DIALOG_EXIT_ID:
AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Do you want to exit?"); builder.setCancelable(true); builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { AlertDialogExample.this.finish(); } });
dialog = builder.create();break;
}
return dialog;}
}
Give the user a message
Dialogs - Creating an AlertDialogpublic class MyDialogs extends Activity {
static final int DIALOG_EXIT_ID = 1;
@Override protected Dialog onCreateDialog(int id) {
Dialog dialog = null;
switch(id) { case DIALOG_EXIT_ID:
AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Do you want to exit?"); builder.setCancelable(true); builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { AlertDialogExample.this.finish(); } });
dialog = builder.create();break;
}
return dialog;}
}
If true, then the user can press the back button to dismiss the dialog. false would force the user to make an action on the dialog.
Dialogs - Creating an AlertDialogpublic class MyDialogs extends Activity {
static final int DIALOG_EXIT_ID = 1;
@Override protected Dialog onCreateDialog(int id) {
Dialog dialog = null;
switch(id) { case DIALOG_EXIT_ID:
AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Do you want to exit?"); builder.setCancelable(true); builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { AlertDialogExample.this.finish(); } });
dialog = builder.create();break;
}
return dialog;}
}
Add a button, AND set a listener for when the button is pressed. This is should be the "positive" button, e.g. "Yes", "Absolutely!"
Dialogs - Creating an AlertDialogpublic class MyDialogs extends Activity {
static final int DIALOG_EXIT_ID = 1;
@Override protected Dialog onCreateDialog(int id) {
Dialog dialog = null;
switch(id) { case DIALOG_EXIT_ID:
AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Do you want to exit?"); builder.setCancelable(true); builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { AlertDialogExample.this.finish(); } });
dialog = builder.create();break;
}
return dialog;}
}
This is the listener for then the "positive" button is pressed, so you should take some kind of action.
Dialogs - Creating an AlertDialogpublic class MyDialogs extends Activity {
static final int DIALOG_EXIT_ID = 1;
@Override protected Dialog onCreateDialog(int id) {
Dialog dialog = null;
switch(id) { case DIALOG_EXIT_ID:
AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Do you want to exit?"); builder.setCancelable(true); builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { AlertDialogExample.this.finish(); } });
dialog = builder.create();break;
}
return dialog;}
}
The Dialog isn't created until you call create()
Dialogs - Creating an AlertDialogpublic class MyDialogs extends Activity {
static final int DIALOG_EXIT_ID = 1;
@Override protected Dialog onCreateDialog(int id) {
Dialog dialog = null;
switch(id) { case DIALOG_EXIT_ID:
AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Do you want to exit?"); builder.setCancelable(true); builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { AlertDialogExample.this.finish(); } });
dialog = builder.create();break;
}
return dialog;}
}
The type of this method is Dialog, so here we return ... the Dialog!
Dialogs - AlertDialog
You can add up to 3 buttons on the AlertDialog by calling
1. dialog.setPositiveButton()
o we just used this one in the previous slides
2. dialog.setNegativeButton()
o "No", "Cancel"3. dialog.setNeutralButton()
o "Remind me Later"
Dialogs - Showing a Dialog
• To show a Dialog on the screen, simply call
o showDialog(int)
from within your Activity.
• It takes as parameter the ID of the dialog.
• You can also call it from within an anonymous inner
class
• Make sure you override the onCreateDialog() method
in that Activity!
Dialogs - Showing a Dialog
See AlertDialogExample
Dialogs - Dismissing a Dialog
• You don't want to show the Dialog to the user forever!
• You have to allow the user to close the dialog somehow,
even if it's not cancelable
• You can dismiss the Dialog by calling
o dismissDialog(int) from within the controlling
Activity where the argument is the Dialog ID
o dismiss() on the Dialog object e.g. dialog.dismiss()
Dialogs - Showing a Dialog
See DismissDialogExample
Dialogs - AlertDialog with a List
• Not only buttons!
• You can also add a list to your AlertDialog
Dialogs - AlertDialog with a ListString[] countries = new String[]{"Netherlands", "USA", "St. Martin", "Curacao"};
@Override public Dialog onCreateDialog(int id) {
Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Select a Country");
builder.setItems(countries, new DialogInterface.OnClickListener() {
@Override public void onClick(DialogInterface dialog, int index) {
Toast.makeText(getApplicationContext(),
"You selected " + countries[index],
Toast.LENGTH_LONG).show(); }
});
return builder.create();
}
Dialogs - AlertDialog with a ListString[] countries = new String[]{"Netherlands", "USA", "St. Martin", "Curacao"};
@Override public Dialog onCreateDialog(int id) {
Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Select a Country");
builder.setItems(countries, new DialogInterface.OnClickListener() {
@Override public void onClick(DialogInterface dialog, int index) {
Toast.makeText(getApplicationContext(),
"You selected " + countries[index],
Toast.LENGTH_LONG).show(); }
});
return builder.create();
}
We will use this String array for our list
Dialogs - AlertDialog with a ListString[] countries = new String[]{"Netherlands", "USA", "St. Martin", "Curacao"};
@Override public Dialog onCreateDialog(int id) {
Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Select a Country");
builder.setItems(countries, new DialogInterface.OnClickListener() {
@Override public void onClick(DialogInterface dialog, int index) {
Toast.makeText(getApplicationContext(),
"You selected " + countries[index],
Toast.LENGTH_LONG).show(); }
});
return builder.create();
}
This is a method in an Activity class, as in the previous example
Dialogs - AlertDialog with a ListString[] countries = new String[]{"Netherlands", "USA", "St. Martin", "Curacao"};
@Override public Dialog onCreateDialog(int id) {
Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Select a Country");
builder.setItems(countries, new DialogInterface.OnClickListener() {
@Override public void onClick(DialogInterface dialog, int index) {
Toast.makeText(getApplicationContext(),
"You selected " + countries[index],
Toast.LENGTH_LONG).show(); }
});
return builder.create();
}
We're still using an AlertDialog Builder
Dialogs - AlertDialog with a ListString[] countries = new String[]{"Netherlands", "USA", "St. Martin", "Curacao"};
@Override public Dialog onCreateDialog(int id) {
Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Select a Country");
builder.setItems(countries, new DialogInterface.OnClickListener() {
@Override public void onClick(DialogInterface dialog, int index) {
Toast.makeText(getApplicationContext(),
"You selected " + countries[index],
Toast.LENGTH_LONG).show(); }
});
return builder.create();
}
This time we call setItems()!
Dialogs - AlertDialog with a ListString[] countries = new String[]{"Netherlands", "USA", "St. Martin", "Curacao"};
@Override public Dialog onCreateDialog(int id) {
Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Select a Country");
builder.setItems(countries, new DialogInterface.OnClickListener() {
@Override public void onClick(DialogInterface dialog, int index) {
Toast.makeText(getApplicationContext(),
"You selected " + countries[index],
Toast.LENGTH_LONG).show(); }
});
return builder.create();
}
First argument should be your list of items
Dialogs - AlertDialog with a ListString[] countries = new String[]{"Netherlands", "USA", "St. Martin", "Curacao"};
@Override public Dialog onCreateDialog(int id) {
Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Select a Country");
builder.setItems(countries, new DialogInterface.OnClickListener() {
@Override public void onClick(DialogInterface dialog, int index) {
Toast.makeText(getApplicationContext(),
"You selected " + countries[index],
Toast.LENGTH_LONG).show(); }
});
return builder.create();
}
There is more than one OnClickListener class!
Dialogs - AlertDialog with a ListString[] countries = new String[]{"Netherlands", "USA", "St. Martin", "Curacao"};
@Override public Dialog onCreateDialog(int id) {
Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Select a Country");
builder.setItems(countries, new DialogInterface.OnClickListener() {
@Override public void onClick(DialogInterface dialog, int index) {
Toast.makeText(getApplicationContext(),
"You selected " + countries[index],
Toast.LENGTH_LONG).show(); }
});
return builder.create();
}
If you want to use both View.OnclickListener (for buttons) and DialogInterface.OnClickListener (for Dialogs), then you need to be more specific here
Dialogs - AlertDialog with a ListString[] countries = new String[]{"Netherlands", "USA", "St. Martin", "Curacao"};
@Override public Dialog onCreateDialog(int id) {
Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Select a Country");
builder.setItems(countries, new DialogInterface.OnClickListener() {
@Override public void onClick(DialogInterface dialog, int index) {
Toast.makeText(getApplicationContext(),
"You selected " + countries[index],
Toast.LENGTH_LONG).show(); }
});
return builder.create();
}
When an item in the list is clicked, Android kindly provides you with the Dialog object itself, as well as the index of the clicked item
Dialogs - AlertDialog with a ListString[] countries = new String[]{"Netherlands", "USA", "St. Martin", "Curacao"};
@Override public Dialog onCreateDialog(int id) {
Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Select a Country");
builder.setItems(countries, new DialogInterface.OnClickListener() {
@Override public void onClick(DialogInterface dialog, int index) {
Toast.makeText(getApplicationContext(),
"You selected " + countries[index],
Toast.LENGTH_LONG).show(); }
});
return builder.create();
}
Let's not forget to create the Dialog and return it
Dialogs - AlertDialog with a List
See AlertDialogListExample
Dialogs - Date/TimePicker Dialogs
See DatePickerDialogExample
Dialogs - Custom Dialogs - SeekBar
• You can create your own Dialog if the standard Android
Dialogs are not suitable for your needs
• For example, there is no SeekBar Dialog, but you can
create your own
• See CustomDialogExample
Dialogs - DialogFragment
• creating Dialogs by using the onCreateDialog() method
of an Activity is old school
• creating Dialogs by using a DialogFragment is new
school
Dialogs - DialogFragment
• DialogFragment also has an onCreateDialog() callback
method!
o i.e., both an Activity and a DialogFragment have an
onCreateDialog() callback method
Dialogs - DialogFragment
DialogFragment is slightly different than the other
Fragments we've seen so far
• We don't need to add it to the XML
• Nor do we need to add it to the UI using a
FragmentTransaction
Dialogs - DialogFragmentpublic class MyActivity extends Activity {
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new OnClickListener() {
@Override public void onClick(View v) {
MyDialogFragment f = new MyDialogFragment();
f.show(getFragmentManager(), "dialog");
}
});
}
public void doPositiveClick() {
Toast.makeText(this, "doPositiveClick()", Toast.LENGTH_LONG).show();
}
}
Dialogs - DialogFragmentpublic class MyActivity extends Activity {
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new OnClickListener() {
@Override public void onClick(View v) {
MyDialogFragment f = new MyDialogFragment();
f.show(getFragmentManager(), "dialog");
}
});
}
public void doPositiveClick() {
Toast.makeText(this, "doPositiveClick()", Toast.LENGTH_LONG).show();
}
}
Let's create our Activity first ...
Dialogs - DialogFragmentpublic class MyActivity extends Activity {
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new OnClickListener() {
@Override public void onClick(View v) {
MyDialogFragment f = new MyDialogFragment();
f.show(getFragmentManager(), "dialog");
}
});
}
public void doPositiveClick() {
Toast.makeText(this, "doPositiveClick()", Toast.LENGTH_LONG).show();
}
}
Let's show the Dialog when this Button is clicked!
Dialogs - DialogFragmentpublic class MyActivity extends Activity {
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new OnClickListener() {
@Override public void onClick(View v) {
MyDialogFragment f = new MyDialogFragment();
f.show(getFragmentManager(), "dialog");
}
});
}
public void doPositiveClick() {
Toast.makeText(this, "doPositiveClick()", Toast.LENGTH_LONG).show();
}
}
The Button was just clicked at this point, so let's create a new instance of MyDialogFragment, which we will see in a few slides
Dialogs - DialogFragmentpublic class MyActivity extends Activity {
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new OnClickListener() {
@Override public void onClick(View v) {
MyDialogFragment f = new MyDialogFragment();
f.show(getFragmentManager(), "dialog");
}
});
}
public void doPositiveClick() {
Toast.makeText(this, "doPositiveClick()", Toast.LENGTH_LONG).show();
}
}
Just call .show() on the Fragment! This time we didn't need to use the FragmentTransaction to add the Fragment
Dialogs - DialogFragmentpublic class MyActivity extends Activity {
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new OnClickListener() {
@Override public void onClick(View v) {
MyDialogFragment f = new MyDialogFragment();
f.show(getFragmentManager(), "dialog");
}
});
}
public void doPositiveClick() {
Toast.makeText(this, "doPositiveClick()", Toast.LENGTH_LONG).show();
}
}
Just pass the FragmentManager and it will take care of adding and removing the Fragment for you
Dialogs - DialogFragmentpublic class MyActivity extends Activity {
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new OnClickListener() {
@Override public void onClick(View v) {
MyDialogFragment f = new MyDialogFragment();
f.show(getFragmentManager(), "dialog");
}
});
}
public void doPositiveClick() {
Toast.makeText(this, "doPositiveClick()", Toast.LENGTH_LONG).show();
}
}
Second argument is the tag that you want to assign to the Fragment
Dialogs - DialogFragmentpublic class MyActivity extends Activity {
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new OnClickListener() {
@Override public void onClick(View v) {
MyDialogFragment f = new MyDialogFragment();
f.show(getFragmentManager(), "dialog");
}
});
}
public void doPositiveClick() {
Toast.makeText(this, "doPositiveClick()", Toast.LENGTH_LONG).show();
}
}
We will get back to this!
Dialogs - DialogFragment
Let's take a look at our DialogFragment
Dialogs - DialogFragmentpublic class MyDialogFragment extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("This is a DialogFragment!");
builder.setPositiveButton("OK", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
MyActivity act= (MyActivity) getActivity();
act.doPositiveClick();
}
});
return builder.create();
}
}
Dialogs - DialogFragmentpublic class MyDialogFragment extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("This is a DialogFragment!");
builder.setPositiveButton("OK", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
MyActivity act= (MyActivity) getActivity();
act.doPositiveClick();
}
});
return builder.create();
}
}
DialogFragment!
Dialogs - DialogFragmentpublic class MyDialogFragment extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("This is a DialogFragment!");
builder.setPositiveButton("OK", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
MyActivity act= (MyActivity) getActivity();
act.doPositiveClick();
}
});
return builder.create();
}
}
Dialog also has an onCreateDialog(), the proof is in the @Override
Dialogs - DialogFragmentpublic class MyDialogFragment extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("This is a DialogFragment!");
builder.setPositiveButton("OK", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
MyActivity act= (MyActivity) getActivity();
act.doPositiveClick();
}
});
return builder.create();
}
}
This is how we get the Context from within a Fragment, remember!?
Dialogs - DialogFragmentpublic class MyDialogFragment extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("This is a DialogFragment!");
builder.setPositiveButton("OK", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
MyActivity act= (MyActivity) getActivity();
act.doPositiveClick();
}
});
return builder.create();
}
}
We need to return a Dialog!
Dialogs - DialogFragmentpublic class MyDialogFragment extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("This is a DialogFragment!");
builder.setPositiveButton("OK", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
MyActivity act= (MyActivity) getActivity();
act.doPositiveClick();
}
});
return builder.create();
}
}
You've seen this other stuff before!
Dialogs - DialogFragmentpublic class MyDialogFragment extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("This is a DialogFragment!");
builder.setPositiveButton("OK", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
MyActivity act= (MyActivity) getActivity();
act.doPositiveClick();
}
});
return builder.create();
}
}
The button in the Dialog has now been clicked! What do we do next?
Dialogs - DialogFragmentpublic class MyDialogFragment extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("This is a DialogFragment!");
builder.setPositiveButton("OK", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
MyActivity act= (MyActivity) getActivity();
act.doPositiveClick();
}
});
return builder.create();
}
}
Let's get a handle on the Activity containing this Fragment
Dialogs - DialogFragmentpublic class MyDialogFragment extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("This is a DialogFragment!");
builder.setPositiveButton("OK", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
MyActivity act= (MyActivity) getActivity();
act.doPositiveClick();
}
});
return builder.create();
}
}
Let's call our own custom method, doPositiveClick() on the Activity
Dialogs - DialogFragmentpublic class MyActivity extends Activity {
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new OnClickListener() {
@Override public void onClick(View v) {
MyDialogFragment f = new MyDialogFragment();
f.show(getFragmentManager(), "dialog");
}
});
}
public void doPositiveClick() {
Toast.makeText(this, "doPositiveClick()", Toast.LENGTH_LONG).show();
}
}
Which takes us back here, back to our Activity.
Dialogs - DialogFragmentpublic class MyActivity extends Activity {
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new OnClickListener() {
@Override public void onClick(View v) {
MyDialogFragment f = new MyDialogFragment();
f.show(getFragmentManager(), "dialog");
}
});
}
public void doPositiveClick() {
Toast.makeText(this, "doPositiveClick()", Toast.LENGTH_LONG).show();
}
}
Simply make a Toast as evidence that we were successful
Dialogs - DialogFragment
• Note that we don't need to override onCreateView() or
onActivityCreated() methods of a DialogFragment
• You may choose to override onCreateView() and return
a View if you want to create some custom Dialog
without using onCreateDialog()
• I'll leave it up to the Android developer's website to
explain it if anyone is interested in doing so
Dialogs - DialogFragment
See FragmentDialogExample
Menu Options
• In Android 2.3.x and below, clicking on the dedicated
Menu button allows the user to reveal menu options
• In Android 3.0 and above, the options menu is
presented by way of an action bar
o the dedicated Menu button is deprecated and some
devices just do not have one
Menu Options - Creating one <= 2.3.x
• Right click on your project > New > Other ...
• Select Android XML File
• In the Resource Type drop down list, select Menu
• Enter a File name and click Finish
• Click Add ... > Item
• Edit the id as appropriate, and enter the Title
• Repeat to add additional menu options
Menu Options - Creating one <= 2.3.x
We will use this Menu XML file, main_menu.xml, for our
example
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/set_text"
android:title="@string/set_text_opt"/>
<item android:id="@+id/close"
android:title="@string/close_opt" />
</menu>
Menu Options - Creating one <= 2.3.x
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
return true;
}
Menu Options - Creating one <= 2.3.x
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
return true;
}
Override this Activity method
Menu Options - Creating one <= 2.3.x
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
return true;
}
Similar to a LayoutInflater, but for Menus instead
Menu Options - Creating one <= 2.3.x
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
return true;
}
Show the Menu now
Menu Options - Creating one <= 2.3.x
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
return true;
}
This is the Menu XML file that we created previously
Menu Options - Creating one <= 2.3.x
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
return true;
}
This is given as argument to onCreateOptionsMenu, so use it as argument to inflate the menu
Menu Options - Creating one <= 2.3.x
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
return true;
}
Return true if you want the menu to be displayed, false if you don't
Menu Options - Creating one <= 2.3.x
• This is enough for the Menu to be displayed on the
screen when the user presses the Menu button
• If you want to take action after an option is selected,
then you need to override the onOptionsItemSelected()
method of Activity
Menu Options - Creating one <= 2.3.x@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.set_text:
TextView tv = (TextView) findViewById(R.id.textView1);
tv.setText("First Option Selected!");
break;
case R.id.close:
Toast.makeText(this, "Goodbye!", Toast.LENGTH_LONG).show();
finish();
break;
}
return true;
}
Menu Options - Creating one <= 2.3.x@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.set_text:
TextView tv = (TextView) findViewById(R.id.textView1);
tv.setText("First Option Selected!");
break;
case R.id.close:
Toast.makeText(this, "Goodbye!", Toast.LENGTH_LONG).show();
finish();
break;
}
return true;
}
We override this method of Activity
Menu Options - Creating one <= 2.3.x@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.set_text:
TextView tv = (TextView) findViewById(R.id.textView1);
tv.setText("First Option Selected!");
break;
case R.id.close:
Toast.makeText(this, "Goodbye!", Toast.LENGTH_LONG).show();
finish();
break;
}
return true;
}
Which menu item was selected?
Menu Options - Creating one <= 2.3.x@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.set_text:
TextView tv = (TextView) findViewById(R.id.textView1);
tv.setText("First Option Selected!");
break;
case R.id.close:
Toast.makeText(this, "Goodbye!", Toast.LENGTH_LONG).show();
finish();
break;
}
return true;
}
Here we just changed the text of a TextView when the item R.id.set_text is selected
Menu Options - Creating one <= 2.3.x@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.set_text:
TextView tv = (TextView) findViewById(R.id.textView1);
tv.setText("First Option Selected!");
break;
case R.id.close:
Toast.makeText(this, "Goodbye!", Toast.LENGTH_LONG).show();
finish();
break;
}
return true;
}
Here we close our app when item R.id.close is selected
Menu Options - Creating one <= 2.3.x
See MenuOptionsExample
Menu Options - Creating one <= 2.3.x
You can change the menu options that show up at runtime
Menu Options - Creating one >= 3.0
For Android 3.0 and higher ...
http://developer.android.com/guide/topics/ui/actionbar.html
Context Menu
• A context menu is a floating menu that appears when
the user performs a long-click on an element. It
provides actions that affect the selected content.
• You can provide a context menu for any view, but they
are most often used for items in a
o ListView
o other view collections in which the user can perform
direct actions on each item.
Context Menu - Creating one
When creating a Context Menu, you can create
a Menu XML file in the same way you do for an
Options Menu
Context Menu - Creating one
We will use the following XML file for our example
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/edit_option" android:title="Edit"></item>
<item android:id="@+id/share_option" android:title="Share"></item>
<item android:id="@+id/delete_option" android:title="Delete"></item>
</menu>
Context Menu - Creating one
We will use the following XML file for our example
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/edit_option" android:title="Edit"></item>
<item android:id="@+id/share_option" android:title="Share"></item>
<item android:id="@+id/delete_option" android:title="Delete"></item>
</menu>
All of the callback methods in this example are declared within our ListActivity
Context Menu - Creating one
As a reminder,
• a ListActivity extends Activity
• it already has a ListView, so you don't need to add one
the the Layout XML file
o you don't even need to use a Layout XML File
o which means you don't need to call
setContentView()
• You can get a handle on the ListView by simply calling
getListView().
Context Menu - Creating onepublic class ContextMenuExample extends ListActivity {
String[] entries = new String[]{"Martin","Anderson","Junior","George","Dan"};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setListAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, entries));
registerForContextMenu(getListView());
}
...
Context Menu - Creating onepublic class ContextMenuExample extends ListActivity {
String[] entries = new String[]
{"Martin","Anderson","Junior","George","Dan"};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setListAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, entries));
registerForContextMenu(getListView());
}
...
We will use this String array to populate our List
Context Menu - Creating onepublic class ContextMenuExample extends ListActivity {
String[] entries = new String[]{"Martin","Anderson","Junior","George","Dan"};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setListAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, entries));
registerForContextMenu(getListView());
}
...
Populate the ListView here
Context Menu - Creating onepublic class ContextMenuExample extends ListActivity {
String[] entries = new String[]{"Martin","Anderson","Junior","George","Dan"};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setListAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, entries));
registerForContextMenu(getListView());
}
...
Register the ListView with a Context Menu, now the menu will show up when you long press on the ListView
Context Menu - Creating onepublic class ContextMenuExample extends ListActivity {
String[] entries = new String[]{"Martin","Anderson","Junior","George","Dan"};
...
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.context_menu, menu);
}
...
onCreate() from previous slide is here
Context Menu - Creating onepublic class ContextMenuExample extends ListActivity {
String[] entries = new String[]{"Martin","Anderson","Junior","George","Dan"};
...
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.context_menu, menu);
}
...
Override this method. It is called when the Context Menu for View v is being built
Context Menu - Creating onepublic class ContextMenuExample extends ListActivity {
String[] entries = new String[]{"Martin","Anderson","Junior","George","Dan"};
...
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.context_menu, menu);
}
...
You've seen this before
Context Menu - Creating onepublic class ContextMenuExample extends ListActivity {
String[] entries = new String[]{"Martin","Anderson","Junior","George","Dan"};
...
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.context_menu, menu);
}
...
onContextItemSelected() on the next slide goes here
Context Menu - Creating one@Override public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
TextView tv = (TextView) getListView().getAdapter().getView(info.position, null, null);
switch(item.getItemId()) {
case R.id.edit_option:
/* Edit option selected */
break;
case R.id.share_option:
/* Share option selected */
break;
case R.id.delete_option:
/* Edit option selected */
break;
}
return true;
}
Override this method of Activity
Context Menu - Creating one@Override public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
TextView tv = (TextView) getListView().getAdapter().getView(info.position, null, null);
switch(item.getItemId()) {
case R.id.edit_option:
/* Edit option selected */
break;
case R.id.share_option:
/* Share option selected */
break;
case R.id.delete_option:
/* Edit option selected */
break;
}
return true;
}
This Object has information about the Context Menu, NOT the item in the List
Context Menu - Creating one@Override public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
TextView tv = (TextView) getListView().getAdapter().getView(info.position, null, null);
switch(item.getItemId()) {
case R.id.edit_option:
/* Edit option selected */
break;
case R.id.share_option:
/* Share option selected */
break;
case R.id.delete_option:
/* Edit option selected */
break;
}
return true;
}
This Object will have information about the item pressed
Context Menu - Creating one@Override public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
TextView tv = (TextView) getListView().getAdapter().getView(info.position, null, null);
switch(item.getItemId()) {
case R.id.edit_option:
/* Edit option selected */
break;
case R.id.share_option:
/* Share option selected */
break;
case R.id.delete_option:
/* Edit option selected */
break;
}
return true;
}
We can get a handle on the item in the ListView by using info.position
Context Menu - Creating one@Override public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
TextView tv = (TextView) getListView().getAdapter().getView(info.position, null, null);
switch(item.getItemId()) {
case R.id.edit_option:
/* Edit option selected */
break;
case R.id.share_option:
/* Share option selected */
break;
case R.id.delete_option:
/* Edit option selected */
break;
}
return true;
}
info.position tells us which item was pressed, this is how we tell which Menu Item was pressed
Context Menu - Creating one@Override public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
TextView tv = (TextView) getListView().getAdapter().getView(info.position, null, null);
switch(item.getItemId()) {
case R.id.edit_option:
/* Edit option selected */
break;
case R.id.share_option:
/* Share option selected */
break;
case R.id.delete_option:
/* Edit option selected */
break;
}
return true;
}
By combining info.position and item.getItemId(), we know the action needs to be performed on the item
Context Menu - Creating one
See ContextMenuExample
Preferences - SharedPreferences
• SharedPreferences is 1 of the 5 methods for Data
Storage in Android
• Internal and external storage, remote server, and local database.
• http://developer.android.com/guide/topics/data/data-storage.html
• It stores primitive key-value pairs of primitive data types
o boolean, int, float, long, String
• Data persists even if your app has been fully terminated
• SharedPreferences are only available to app that
created them!
Preferences - SharedPreferencespublic class SharedPrefsExample extends Activity {
public static final String PREFS_NAME = "MyPrefsFile";
@Override protected void onCreate(Bundle state){super.onCreate(state);
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);boolean silent = settings.getBoolean("silentMode", false);setSilent(silent);
}
@Override protected void onStop(){super.onStop();
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);SharedPreferences.Editor editor = settings.edit();editor.putBoolean("silentMode", mSilentMode);editor.commit();
}}
Preferences - SharedPreferencespublic class SharedPrefsExample extends Activity {
public static final String PREFS_NAME = "MyPrefsFile";
@Override protected void onCreate(Bundle state){super.onCreate(state);
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);boolean silent = settings.getBoolean("silentMode", false);setSilent(silent);
}
@Override protected void onStop(){super.onStop();
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);SharedPreferences.Editor editor = settings.edit();editor.putBoolean("silentMode", mSilentMode);editor.commit();
}}
The desired name of your SharedPreferences file
Preferences - SharedPreferencespublic class SharedPrefsExample extends Activity {
public static final String PREFS_NAME = "MyPrefsFile";
@Override protected void onCreate(Bundle state){super.onCreate(state);
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);boolean silent = settings.getBoolean("silentMode", false);setSilent(silent);
}
@Override protected void onStop(){super.onStop();
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);SharedPreferences.Editor editor = settings.edit();editor.putBoolean("silentMode", mSilentMode);editor.commit();
}}
You can get a SharedPreferences file by name by calling this method
Preferences - SharedPreferencespublic class SharedPrefsExample extends Activity {
public static final String PREFS_NAME = "MyPrefsFile";
@Override protected void onCreate(Bundle state){super.onCreate(state);
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);boolean silent = settings.getBoolean("silentMode", false);setSilent(silent);
}
@Override protected void onStop(){super.onStop();
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);SharedPreferences.Editor editor = settings.edit();editor.putBoolean("silentMode", mSilentMode);editor.commit();
}}
The second argument is the mode
Preferences - SharedPreferencespublic class SharedPrefsExample extends Activity {
public static final String PREFS_NAME = "MyPrefsFile";
@Override protected void onCreate(Bundle state){super.onCreate(state);
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);boolean silent = settings.getBoolean("silentMode", false);setSilent(silent);
}
@Override protected void onStop(){super.onStop();
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);SharedPreferences.Editor editor = settings.edit();editor.putBoolean("silentMode", mSilentMode);editor.commit();
}}
If the SharedPreferences file doesn't exist at this point, it will be created for you
Preferences - SharedPreferencespublic class SharedPrefsExample extends Activity {
public static final String PREFS_NAME = "MyPrefsFile";
@Override protected void onCreate(Bundle state){super.onCreate(state);
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);boolean silent = settings.getBoolean("silentMode", false);setSilent(silent);
}
@Override protected void onStop(){super.onStop();
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);SharedPreferences.Editor editor = settings.edit();editor.putBoolean("silentMode", mSilentMode);editor.commit();
}}
Try to get the boolean value "silentMode", "silentMode" is the key. You decide on the name of the key. "silentMode" is not a keyword here
Preferences - SharedPreferencespublic class SharedPrefsExample extends Activity {
public static final String PREFS_NAME = "MyPrefsFile";
@Override protected void onCreate(Bundle state){super.onCreate(state);
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);boolean silent = settings.getBoolean("silentMode", false);setSilent(silent);
}
@Override protected void onStop(){super.onStop();
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);SharedPreferences.Editor editor = settings.edit();editor.putBoolean("silentMode", mSilentMode);editor.commit();
}}
If the key doesn't exist (could be because the file was just created in the previous line of code), then this will be the value returned
Preferences - SharedPreferencespublic class SharedPrefsExample extends Activity {
public static final String PREFS_NAME = "MyPrefsFile";
@Override protected void onCreate(Bundle state){super.onCreate(state);
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);boolean silent = settings.getBoolean("silentMode", false);setSilent(silent);
}
@Override protected void onStop(){super.onStop();
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);SharedPreferences.Editor editor = settings.edit();editor.putBoolean("silentMode", mSilentMode);editor.commit();
}}
An imaginary method that you created to change the volume setting of the device to silent
Preferences - SharedPreferencespublic class SharedPrefsExample extends Activity {
public static final String PREFS_NAME = "MyPrefsFile";
@Override protected void onCreate(Bundle state){super.onCreate(state);
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);boolean silent = settings.getBoolean("silentMode", false);setSilent(silent);
}
@Override protected void onStop(){super.onStop();
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);SharedPreferences.Editor editor = settings.edit();editor.putBoolean("silentMode", mSilentMode);editor.commit();
}}
We want data to persist even after the app has been terminated, so let's Override onStop()
Preferences - SharedPreferencespublic class SharedPrefsExample extends Activity {
public static final String PREFS_NAME = "MyPrefsFile";
@Override protected void onCreate(Bundle state){super.onCreate(state);
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);boolean silent = settings.getBoolean("silentMode", false);setSilent(silent);
}
@Override protected void onStop(){super.onStop();
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);SharedPreferences.Editor editor = settings.edit();editor.putBoolean("silentMode", mSilentMode);editor.commit();
}}
Get a handle on our SharedPreferences again, which should have the "silentMode" value set at this point
Preferences - SharedPreferencespublic class SharedPrefsExample extends Activity {
public static final String PREFS_NAME = "MyPrefsFile";
@Override protected void onCreate(Bundle state){super.onCreate(state);
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);boolean silent = settings.getBoolean("silentMode", false);setSilent(silent);
}
@Override protected void onStop(){super.onStop();
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);SharedPreferences.Editor editor = settings.edit();editor.putBoolean("silentMode", mSilentMode);editor.commit();
}}
If we want to modify the SharedPreferences, we need to use a SharedPreferences Editor
Preferences - SharedPreferencespublic class SharedPrefsExample extends Activity {
public static final String PREFS_NAME = "MyPrefsFile";
@Override protected void onCreate(Bundle state){super.onCreate(state);
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);boolean silent = settings.getBoolean("silentMode", false);setSilent(silent);
}
@Override protected void onStop(){super.onStop();
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);SharedPreferences.Editor editor = settings.edit();editor.putBoolean("silentMode", mSilentMode);editor.commit();
}}
Let's set the value value of silentMode to the imaginary boolean value mSilentMode
Preferences - SharedPreferencespublic class SharedPrefsExample extends Activity {
public static final String PREFS_NAME = "MyPrefsFile";
@Override protected void onCreate(Bundle state){super.onCreate(state);
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);boolean silent = settings.getBoolean("silentMode", false);setSilent(silent);
}
@Override protected void onStop(){super.onStop();
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);SharedPreferences.Editor editor = settings.edit();editor.putBoolean("silentMode", mSilentMode);editor.commit();
}}
Don't forget to save your changes to the file!
Preferences - SharedPreferences
See SharedPrefsExample
Preferences - PreferenceActivity
If you want to provide the user with a UI for changing
preferences, you can use a PreferenceActivity in
combination with SharedPreferences
To create a PreferenceActivity, first create a Preference
XML file
Preferences - PreferenceActivity
• File > New > Other > Android XML File
• Resource Type: Preference
• Enter the file name, e.g. preferences.xml
• Root Element: PreferenceScreen
• Click Add to add various types of Preferences
o e.g. EditText
• Expand the Attributes on the right to edit the attributes
for your preferences
Preferences - PreferenceActivity
We will use this preferences.xml file for our example
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<EditTextPreference android:dialogTitle="Username" android:dialogMessage="Please enter your
Username" android:summary="Username for logging in to this app" android:title="Username"
android:key="username"/>
<CheckBoxPreference android:summaryOff="I do not want your spam" android:key="spam"
android:title="Spam" android:summaryOn="Sign me up for spam"/>
</PreferenceScreen>
Preferences - PreferenceActivity
Creating a PreferenceActivity is easy!
Preferences - PreferenceActivity
public class Preferences extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
Preferences - PreferenceActivity
public class Preferences extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
Extend PreferenceActivity
Preferences - PreferenceActivity
public class Preferences extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
From the preferences.xml file we added previously
Preferences - PreferenceActivity
In your main Activity, you can get the Preferences without
specifying the name of the XML file
Preferences - PreferenceActivity
public class MainActivity extends Activity {
SharedPreferences mPrefs;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPrefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
String username = mPrefs.getString("username","None");
}
}
Preferences - PreferenceActivity
public class MainActivity extends Activity {
SharedPreferences mPrefs;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPrefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
String username = mPrefs.getString("username","None");
}
}
This will allow you to access the preference settings, even if you have more than one preference XML file associated with a PreferenceActivity
Preferences - PreferenceActivity
public class MainActivity extends Activity {
SharedPreferences mPrefs;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPrefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
String username = mPrefs.getString("username","None");
}
}
These preferences will automatically save when the user interacts with them!
Preferences - PreferenceActivity
See PreferenceActivityExample
Preferences - PreferenceActivity
• You can also add a Listener for when a
Preference has been changed
• When a Preference is changed, you may
need to update certain values tied to these
Preferences
Preferences - PreferenceFragment
Android 3.0 and higher
PreferenceFragment
References
• The Busy Coder's Guide to Android Development - Mark Murphy
• Android Developers
• The Mobile Lab at Florida State University