Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences.

Post on 18-Jan-2016

216 views 0 download

Transcript of Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences.

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 List

String[] 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 List

String[] 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 List

String[] 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 List

String[] 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 List

String[] 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 List

String[] 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 List

String[] 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 List

String[] 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 List

String[] 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 List

String[] 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 - DialogFragment

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

public 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