Top Banner
Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences
131

Mobile Programming Lecture 7

Feb 23, 2016

Download

Documents

Deon

Mobile Programming Lecture 7. Dialogs, Menus, and SharedPreferences. Agenda. Dialogs Menus SharedPreferences. Android Application Components. Activity 2. Broadcast Receiver 3. Content Provider 4. Service. Dialogs. - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Mobile Programming Lecture 7

Mobile ProgrammingLecture 7

Dialogs, Menus, and SharedPreferences

Page 2: Mobile Programming Lecture 7

Agenda

• Dialogs

• Menus

• SharedPreferences

Page 3: Mobile Programming Lecture 7

Android Application Components

1. Activity

2. Broadcast Receiver

3. Content Provider

4. Service

Page 4: Mobile Programming Lecture 7

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

Page 5: Mobile Programming Lecture 7

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

Page 6: Mobile Programming Lecture 7

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

Page 7: Mobile Programming Lecture 7

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)

Page 8: Mobile Programming Lecture 7

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

}

Page 9: Mobile Programming Lecture 7

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

Page 10: Mobile Programming Lecture 7

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

Page 11: Mobile Programming Lecture 7

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

Page 12: Mobile Programming Lecture 7

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

Page 13: Mobile Programming Lecture 7

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

Page 14: Mobile Programming Lecture 7

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.

Page 15: Mobile Programming Lecture 7

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

Page 16: Mobile Programming Lecture 7

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.

Page 17: Mobile Programming Lecture 7

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

Page 18: Mobile Programming Lecture 7

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!

Page 19: Mobile Programming Lecture 7

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"

Page 20: Mobile Programming Lecture 7

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!

Page 21: Mobile Programming Lecture 7

Dialogs - Showing a Dialog

See AlertDialogExample

Page 22: Mobile Programming Lecture 7

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

Page 23: Mobile Programming Lecture 7

Dialogs - Showing a Dialog

See DismissDialogExample

Page 24: Mobile Programming Lecture 7

Dialogs - AlertDialog with a List

• Not only buttons!

• You can also add a list to your AlertDialog

Page 25: Mobile Programming Lecture 7

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();

}

Page 26: Mobile Programming Lecture 7

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

Page 27: Mobile Programming Lecture 7

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

Page 28: Mobile Programming Lecture 7

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

Page 29: Mobile Programming Lecture 7

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()!

Page 30: Mobile Programming Lecture 7

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

Page 31: Mobile Programming Lecture 7

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!

Page 32: Mobile Programming Lecture 7

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

Page 33: Mobile Programming Lecture 7

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

Page 34: Mobile Programming Lecture 7

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

Page 35: Mobile Programming Lecture 7

Dialogs - AlertDialog with a List

See AlertDialogListExample

Page 36: Mobile Programming Lecture 7

Dialogs - Date/TimePicker Dialogs

See DatePickerDialogExample

Page 37: Mobile Programming Lecture 7

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

Page 38: Mobile Programming Lecture 7

Dialogs - DialogFragment

• creating Dialogs by using the onCreateDialog() method

of an Activity is old school

• creating Dialogs by using a DialogFragment is new

school

Page 39: Mobile Programming Lecture 7

Dialogs - DialogFragment

• DialogFragment also has an onCreateDialog() callback

method!

o i.e., both an Activity and a DialogFragment have an

onCreateDialog() callback method

Page 40: Mobile Programming Lecture 7

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

Page 41: Mobile Programming Lecture 7

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();

}

}

Page 42: Mobile Programming Lecture 7

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

Page 43: Mobile Programming Lecture 7

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!

Page 44: Mobile Programming Lecture 7

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

Page 45: Mobile Programming Lecture 7

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

Page 46: Mobile Programming Lecture 7

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

Page 47: Mobile Programming Lecture 7

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

Page 48: Mobile Programming Lecture 7

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!

Page 49: Mobile Programming Lecture 7

Dialogs - DialogFragment

Let's take a look at our DialogFragment

Page 50: Mobile Programming Lecture 7

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();

}

}

Page 51: Mobile Programming Lecture 7

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!

Page 52: Mobile Programming Lecture 7

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

Page 53: Mobile Programming Lecture 7

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

Page 54: Mobile Programming Lecture 7

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!

Page 55: Mobile Programming Lecture 7

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!

Page 56: Mobile Programming Lecture 7

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?

Page 57: Mobile Programming Lecture 7

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

Page 58: Mobile Programming Lecture 7

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

Page 59: Mobile Programming Lecture 7

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.

Page 60: Mobile Programming Lecture 7

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

Page 61: Mobile Programming Lecture 7

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

Page 62: Mobile Programming Lecture 7

Dialogs - DialogFragment

See FragmentDialogExample

Page 63: Mobile Programming Lecture 7

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

Page 64: Mobile Programming Lecture 7

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

Page 65: Mobile Programming Lecture 7

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>

Page 66: Mobile Programming Lecture 7

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;

}

Page 67: Mobile Programming Lecture 7

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

Page 68: Mobile Programming Lecture 7

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

Page 69: Mobile Programming Lecture 7

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

Page 70: Mobile Programming Lecture 7

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

Page 71: Mobile Programming Lecture 7

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

Page 72: Mobile Programming Lecture 7

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

Page 73: Mobile Programming Lecture 7

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

Page 74: Mobile Programming Lecture 7

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;

}

Page 75: Mobile Programming Lecture 7

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

Page 76: Mobile Programming Lecture 7

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?

Page 77: Mobile Programming Lecture 7

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

Page 78: Mobile Programming Lecture 7

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

Page 79: Mobile Programming Lecture 7

Menu Options - Creating one <= 2.3.x

See MenuOptionsExample

Page 80: Mobile Programming Lecture 7

Menu Options - Creating one <= 2.3.x

You can change the menu options that show up at runtime

Page 81: Mobile Programming Lecture 7

Menu Options - Creating one >= 3.0

For Android 3.0 and higher ...

http://developer.android.com/guide/topics/ui/actionbar.html

Page 82: Mobile Programming Lecture 7

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.

Page 83: Mobile Programming Lecture 7

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

Page 84: Mobile Programming Lecture 7

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>

Page 85: Mobile Programming Lecture 7

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

Page 86: Mobile Programming Lecture 7

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().

Page 87: Mobile Programming Lecture 7

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());

}

...

Page 88: Mobile Programming Lecture 7

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

Page 89: Mobile Programming Lecture 7

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

Page 90: Mobile Programming Lecture 7

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

Page 91: Mobile Programming Lecture 7

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

Page 92: Mobile Programming Lecture 7

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

Page 93: Mobile Programming Lecture 7

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

Page 94: Mobile Programming Lecture 7

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

Page 95: Mobile Programming Lecture 7

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

Page 96: Mobile Programming Lecture 7

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

Page 97: Mobile Programming Lecture 7

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

Page 98: Mobile Programming Lecture 7

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

Page 99: Mobile Programming Lecture 7

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

Page 100: Mobile Programming Lecture 7

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

Page 101: Mobile Programming Lecture 7

Context Menu - Creating one

See ContextMenuExample

Page 102: Mobile Programming Lecture 7

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!

Page 103: Mobile Programming Lecture 7

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();

}}

Page 104: Mobile Programming Lecture 7

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

Page 105: Mobile Programming Lecture 7

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

Page 106: Mobile Programming Lecture 7

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

Page 107: Mobile Programming Lecture 7

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

Page 108: Mobile Programming Lecture 7

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

Page 109: Mobile Programming Lecture 7

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

Page 110: Mobile Programming Lecture 7

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

Page 111: Mobile Programming Lecture 7

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

Page 112: Mobile Programming Lecture 7

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

Page 113: Mobile Programming Lecture 7

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

Page 114: Mobile Programming Lecture 7

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

Page 115: Mobile Programming Lecture 7

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!

Page 116: Mobile Programming Lecture 7

Preferences - SharedPreferences

See SharedPrefsExample

Page 117: Mobile Programming Lecture 7

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

Page 118: Mobile Programming Lecture 7

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

Page 119: Mobile Programming Lecture 7

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>

Page 120: Mobile Programming Lecture 7

Preferences - PreferenceActivity

Creating a PreferenceActivity is easy!

Page 121: Mobile Programming Lecture 7

Preferences - PreferenceActivity

public class Preferences extends PreferenceActivity {

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

addPreferencesFromResource(R.xml.preferences);

}

Page 122: Mobile Programming Lecture 7

Preferences - PreferenceActivity

public class Preferences extends PreferenceActivity {

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

addPreferencesFromResource(R.xml.preferences);

}

Extend PreferenceActivity

Page 123: Mobile Programming Lecture 7

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

Page 124: Mobile Programming Lecture 7

Preferences - PreferenceActivity

In your main Activity, you can get the Preferences without

specifying the name of the XML file

Page 125: Mobile Programming Lecture 7

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");

}

}

Page 126: Mobile Programming Lecture 7

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

Page 127: Mobile Programming Lecture 7

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!

Page 128: Mobile Programming Lecture 7

Preferences - PreferenceActivity

See PreferenceActivityExample

Page 129: Mobile Programming Lecture 7

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

Page 130: Mobile Programming Lecture 7

Preferences - PreferenceFragment

Android 3.0 and higher

PreferenceFragment

Page 131: Mobile Programming Lecture 7

References

• The Busy Coder's Guide to Android Development - Mark Murphy

• Android Developers

• The Mobile Lab at Florida State University