mobile programming lecture 7 dialogs, menus, and sharedpreferences

131
Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

Upload: anthony-alexander

Post on 18-Jan-2016

216 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

Mobile ProgrammingLecture 7

Dialogs, Menus, and SharedPreferences

Page 2: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

Agenda

• Dialogs

• Menus

• SharedPreferences

Page 3: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

Android Application Components

1. Activity

2. Broadcast Receiver

3. Content Provider

4. Service

Page 4: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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, Menus, and SharedPreferences

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, Menus, and SharedPreferences

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, Menus, and SharedPreferences

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, Menus, and SharedPreferences

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, Menus, and SharedPreferences

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, Menus, and SharedPreferences

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, Menus, and SharedPreferences

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, Menus, and SharedPreferences

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, Menus, and SharedPreferences

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, Menus, and SharedPreferences

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, Menus, and SharedPreferences

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, Menus, and SharedPreferences

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, Menus, and SharedPreferences

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, Menus, and SharedPreferences

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, Menus, and SharedPreferences

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, Menus, and SharedPreferences

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, Menus, and SharedPreferences

Dialogs - Showing a Dialog

See AlertDialogExample

Page 22: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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, Menus, and SharedPreferences

Dialogs - Showing a Dialog

See DismissDialogExample

Page 24: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

Dialogs - AlertDialog with a List

• Not only buttons!

• You can also add a list to your AlertDialog

Page 25: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

}

Page 26: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 27: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 28: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 29: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 30: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 31: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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!

Page 32: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 33: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 34: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 35: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

Dialogs - AlertDialog with a List

See AlertDialogListExample

Page 36: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

Dialogs - Date/TimePicker Dialogs

See DatePickerDialogExample

Page 37: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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, Menus, and SharedPreferences

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, Menus, and SharedPreferences

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, Menus, and SharedPreferences

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, Menus, and SharedPreferences

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

}

}

Page 42: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 43: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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!

Page 44: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 45: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 46: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 47: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 48: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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!

Page 49: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

Dialogs - DialogFragment

Let's take a look at our DialogFragment

Page 50: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

}

}

Page 51: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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!

Page 52: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 53: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 54: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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!

Page 55: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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!

Page 56: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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?

Page 57: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 58: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 59: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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.

Page 60: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 61: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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, Menus, and SharedPreferences

Dialogs - DialogFragment

See FragmentDialogExample

Page 63: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

Menu Options - Creating one <= 2.3.x

See MenuOptionsExample

Page 80: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

Menu Options - Creating one <= 2.3.x

You can change the menu options that show up at runtime

Page 81: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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

}

...

Page 88: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 89: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 90: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 91: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 92: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 93: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 94: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 95: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

Context Menu - Creating one

See ContextMenuExample

Page 102: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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

}}

Page 104: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 105: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 106: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 107: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 108: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 109: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 110: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 111: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 112: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 113: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 114: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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

Page 115: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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!

Page 116: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

Preferences - SharedPreferences

See SharedPrefsExample

Page 117: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

Preferences - PreferenceActivity

Creating a PreferenceActivity is easy!

Page 121: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

Preferences - PreferenceActivity

See PreferenceActivityExample

Page 129: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

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 Dialogs, Menus, and SharedPreferences

Preferences - PreferenceFragment

Android 3.0 and higher

PreferenceFragment

Page 131: Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

References

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

• Android Developers

• The Mobile Lab at Florida State University