mobile programming lecture 7 -...

132
Mobile Programming Lecture 7 Dialogs, Menus, and SharedPreferences

Upload: tranthuy

Post on 16-Apr-2018

216 views

Category:

Documents


0 download

TRANSCRIPT

Mobile ProgrammingLecture 7

Dialogs, Menus, and SharedPreferences

Agenda

● Dialogs● Menus● SharedPreferences

Android Application Components

1. Activity

2. Broadcast Receiver

3. Content Provider

4. Service

Dialogs

● A Dialog is a small window that appears in front of the current Activity

● It causes the Activity to lose focus● Used for ProgressBars, Alerts, etc

Dialogs

● onCreateDialog called the first time the showDialog(int) method is called

● onPrepareDialog called every time it’s opened and as such will allow you to override your dialog before it is shown○ Without this, it will remain the same as the first time it was

opened

Note: As of API Level 13 onCreateDialog and onPrepareDialog were deprecated in favor of DialogFragment

Dialogs - AlertDialog

● An AlertDialog is an extension of the Dialog class

● It is capable of constructing most Dialog user interfaces and is the suggested Dialog type

Dialogs - AlertDialog

● You should use it for Dialogs that use any of the following features○ A title

○ A text message

○ One, two, or three buttons

○ A list of selectable items (with optional checkboxes or radio buttons)

Dialogs - Creating an AlertDialogpublic class MyDialogs extends Activity {

static final int DIALOG_EXIT_ID = 1;

@Override protected Dialog onCreateDialog( int id) {

Dialog dialog = null;

switch (id) { case DIALOG_EXIT_ID :

AlertDialog.Builder builder = new AlertDialog.Builder( this); builder.setMessage( "Do you want to exit?" ); builder.setCancelable( true); builder.setPositiveButton( "Yes", new

DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { AlertDialogExample.this.finish(); } });

dialog = builder.create();break;

}

return dialog;}

}

Dialogs - Creating an AlertDialogpublic class MyDialogs extends Activity {

static final int DIALOG_EXIT_ID = 1;

@Override protected Dialog onCreateDialog(int id) {

Dialog dialog = null;

switch(id) { case DIALOG_EXIT_ID:

AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Do you want to exit?"); builder.setCancelable(true); builder.setPositiveButton("Yes", new

DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { AlertDialogExample.this.finish(); } });

dialog = builder.create();break;

}

return dialog;}

}

Nothing special here, just an int I use to identify the dialog, because we can have more than one

Dialogs - Creating an AlertDialogpublic class MyDialogs extends Activity {

static final int DIALOG_EXIT_ID = 1;

@Override protected Dialog onCreateDialog(int id) {

Dialog dialog = null;

switch(id) { case DIALOG_EXIT_ID:

AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Do you want to exit?"); builder.setCancelable(true); builder.setPositiveButton("Yes", new

DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { AlertDialogExample.this.finish(); } });

dialog = builder.create();break;

}

return dialog;}

}

Override this method of Activity, which is called when you want to show any dialog of the Activity

Dialogs - Creating an AlertDialogpublic class MyDialogs extends Activity {

static final int DIALOG_EXIT_ID = 1;

@Override protected Dialog onCreateDialog(int id) {

Dialog dialog = null;

switch(id) { case DIALOG_EXIT_ID:

AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Do you want to exit?"); builder.setCancelable(true); builder.setPositiveButton("Yes", new

DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { AlertDialogExample.this.finish(); } });

dialog = builder.create();break;

}

return dialog;}

}

Switch because we can have more than one dialog, meaning we need to check the dialog id

Dialogs - Creating an AlertDialogpublic class MyDialogs extends Activity {

static final int DIALOG_EXIT_ID = 1;

@Override protected Dialog onCreateDialog(int id) {

Dialog dialog = null;

switch(id) { case DIALOG_EXIT_ID:

AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Do you want to exit?"); builder.setCancelable(true); builder.setPositiveButton("Yes", new

DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { AlertDialogExample.this.finish(); } });

dialog = builder.create();break;

}

return dialog;}

}

If you want an AlertDialog, you need to build one first

Dialogs - Creating an AlertDialogpublic class MyDialogs extends Activity {

static final int DIALOG_EXIT_ID = 1;

@Override protected Dialog onCreateDialog(int id) {

Dialog dialog = null;

switch(id) { case DIALOG_EXIT_ID:

AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Do you want to exit?"); builder.setCancelable(true); builder.setPositiveButton("Yes", new

DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { AlertDialogExample.this.finish(); } });

dialog = builder.create();break;

}

return dialog;}

}

Give the user a message

Dialogs - Creating an AlertDialogpublic class MyDialogs extends Activity {

static final int DIALOG_EXIT_ID = 1;

@Override protected Dialog onCreateDialog(int id) {

Dialog dialog = null;

switch(id) { case DIALOG_EXIT_ID:

AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Do you want to exit?"); builder.setCancelable(true); builder.setPositiveButton("Yes", new

DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { AlertDialogExample.this.finish(); } });

dialog = builder.create();break;

}

return dialog;}

}

If true, then the user can press the back button to dismiss the dialog. false would force the user to make an action on the dialog.

Dialogs - Creating an AlertDialogpublic class MyDialogs extends Activity {

static final int DIALOG_EXIT_ID = 1;

@Override protected Dialog onCreateDialog(int id) {

Dialog dialog = null;

switch(id) { case DIALOG_EXIT_ID:

AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Do you want to exit?"); builder.setCancelable(true); builder.setPositiveButton("Yes", new

DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { AlertDialogExample.this.finish(); } });

dialog = builder.create();break;

}

return dialog;}

}

Add a button, AND set a listener for when the button is pressed. This should be the "positive" button, e.g. "Yes", "Absolutely!"

Dialogs - Creating an AlertDialogpublic class MyDialogs extends Activity {

static final int DIALOG_EXIT_ID = 1;

@Override protected Dialog onCreateDialog(int id) {

Dialog dialog = null;

switch(id) { case DIALOG_EXIT_ID:

AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Do you want to exit?"); builder.setCancelable(true); builder.setPositiveButton("Yes", new

DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { AlertDialogExample.this.finish(); } });

dialog = builder.create();break;

}

return dialog;}

}

This is the listener for when the "positive" button is pressed, so you should take some kind of action.

Dialogs - Creating an AlertDialogpublic class MyDialogs extends Activity {

static final int DIALOG_EXIT_ID = 1;

@Override protected Dialog onCreateDialog(int id) {

Dialog dialog = null;

switch(id) { case DIALOG_EXIT_ID:

AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Do you want to exit?"); builder.setCancelable(true); builder.setPositiveButton("Yes", new

DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { AlertDialogExample.this.finish();

} });

dialog = builder.create();break;

}

return dialog;}

}

The Dialog isn't created until you call create()

Dialogs - Creating an AlertDialogpublic class MyDialogs extends Activity {

static final int DIALOG_EXIT_ID = 1;

@Override protected Dialog onCreateDialog(int id) {

Dialog dialog = null;

switch(id) { case DIALOG_EXIT_ID:

AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Do you want to exit?"); builder.setCancelable(true); builder.setPositiveButton("Yes", new

DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { AlertDialogExample.this.finish(); }

});dialog = builder.create();break;

}

return dialog;}

}

The type of this method is Dialog, so here we return ... the Dialog!

Dialogs - AlertDialog

You can add up to 3 buttons on the AlertDialog by calling1. dialog.setPositiveButton()

○ We just used this one in the previous slides

2. dialog.setNegativeButton()○ "No", "Cancel"

3. dialog.setNeutralButton()○ "Remind me Later"

Dialogs - Showing a Dialog

● To show a Dialog on the screen, simply call

○ showDialog(int)

from within your Activity.

● It takes the ID of the dialog as a parameter.

● You can also call it from within an anonymous inner

class

● Make sure you override the onCreateDialog()

method in that Activity!

Dialogs - Showing a Dialog

See AlertDialogExample

Dialogs - Dismissing a Dialog

● You don't want to show the Dialog to the user forever!

● You have to allow the user to close the Dialog

somehow, even if it's not cancelable

● You can dismiss the Dialog by calling

○ dismissDialog(int) from within the controlling

Activity where the argument is the Dialog ID

○ dismiss() on the Dialog object

■ e.g. dialog.dismiss()

Dialogs - Showing a Dialog

See DismissDialogExample

Dialogs - AlertDialog with a List

● Not only buttons!

● You can also add a list to your AlertDialog

Dialogs - AlertDialog with a ListString[] countries = new String[] { "Bahamas", "Barbados", "Jamaica", "St. Martin"};

@Override

public Dialog onCreateDialog(int id) {

Builder builder = new AlertDialog.Builder(this);

builder.setTitle("Select a Country");

builder.setItems(countries, new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int index) {

Toast.makeText(getApplicationContext(),

"You selected " + countries[index], Toast.LENGTH_LONG).show();

}

});

return builder.create();

}

Dialogs - AlertDialog with a ListString[] countries = new String[]{"Bahamas", "Barbados", "Jamaica", "St. Martin"};

@Override

public Dialog onCreateDialog(int id) {

Builder builder = new AlertDialog.Builder(this);

builder.setTitle("Select a Country");

builder.setItems(countries, new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int index) {

Toast.makeText(getApplicationContext(),

"You selected " + countries[index], Toast.LENGTH_LONG).show();

}

});

return builder.create();

}

We will use this String array for our list

Dialogs - AlertDialog with a ListString[] countries = new String[]{"Bahamas", "Barbados", "Jamaica", "St. Martin"};

@Override

public Dialog onCreateDialog(int id) {

Builder builder = new AlertDialog.Builder(this);

builder.setTitle("Select a Country");

builder.setItems(countries, new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int index) {

Toast.makeText(getApplicationContext(),

"You selected " + countries[index], Toast.LENGTH_LONG).show();

}

});

return builder.create();

}

This is a method in an Activity class, as in the previous example

Dialogs - AlertDialog with a ListString[] countries = new String[]{"Bahamas", "Barbados", "Jamaica", "St. Martin"};

@Override

public Dialog onCreateDialog(int id) {

Builder builder = new AlertDialog.Builder(this);

builder.setTitle("Select a Country");

builder.setItems(countries, new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int index) {

Toast.makeText(getApplicationContext(),

"You selected " + countries[index], Toast.LENGTH_LONG).show();

}

});

return builder.create();

}

We're still using an AlertDialog Builder

Dialogs - AlertDialog with a ListString[] countries = new String[]{"Bahamas", "Barbados", "Jamaica", "St. Martin"};

@Override

public Dialog onCreateDialog(int id) {

Builder builder = new AlertDialog.Builder(this);

builder.setTitle("Select a Country");

builder.setItems(countries, new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int index) {

Toast.makeText(getApplicationContext(),

"You selected " + countries[index], Toast.LENGTH_LONG).show();

}

});

return builder.create();

}

This time we call setItems()!

Dialogs - AlertDialog with a ListString[] countries = new String[]{"Bahamas", "Barbados", "Jamaica", "St. Martin"};

@Override

public Dialog onCreateDialog(int id) {

Builder builder = new AlertDialog.Builder(this);

builder.setTitle("Select a Country");

builder.setItems(countries, new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int index) {

Toast.makeText(getApplicationContext(),

"You selected " + countries[index], Toast.LENGTH_LONG).show();

}

});

return builder.create();

}

First argument should be your list of items

Dialogs - AlertDialog with a ListString[] countries = new String[]{"Bahamas", "Barbados", "Jamaica", "St. Martin"};

@Override

public Dialog onCreateDialog(int id) {

Builder builder = new AlertDialog.Builder(this);

builder.setTitle("Select a Country");

builder.setItems(countries, new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int index) {

Toast.makeText(getApplicationContext(),

"You selected " + countries[index], Toast.LENGTH_LONG).show();

}

});

return builder.create();

}

There is more than one OnClickListener class!

Dialogs - AlertDialog with a ListString[] countries = new String[]{"Bahamas", "Barbados", "Jamaica", "St. Martin"};

@Override

public Dialog onCreateDialog(int id) {

Builder builder = new AlertDialog.Builder(this);

builder.setTitle("Select a Country");

builder.setItems(countries, new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int index) {

Toast.makeText(getApplicationContext(),

"You selected " + countries[index], Toast.LENGTH_LONG).show();

}

});

return builder.create();

}

If you want to use both View.OnclickListener (for buttons) and DialogInterface.OnClickListener (for Dialogs), then you need to be more specific here

Dialogs - AlertDialog with a ListString[] countries = new String[]{"Bahamas", "Barbados", "Jamaica", "St. Martin"};

@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, you are Android kindly provides you with the Dialog itself, as well as the index of the clicked item

Dialogs - AlertDialog with a ListString[] countries = new String[]{"Bahamas", "Barbados", "Jamaica", "St. Martin"};

@Override

public Dialog onCreateDialog(int id) {

Builder builder = new AlertDialog.Builder(this);

builder.setTitle("Select a Country");

builder.setItems(countries, new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int index) {

Toast.makeText(getApplicationContext(),

"You selected " + countries[index], Toast.LENGTH_LONG).show();

}

});

return builder.create();

}

Let's not forget to create the Dialog and return it

Dialogs - AlertDialog with a List

See AlertDialogListExample

Dialogs - AlertDialog Custom View

● If you wish to display just a simple message to your user the setMessage() method will suffice

● To display a more complex view, first get a handle on the default FrameLayout “custom”

○ FrameLayout custom = (FrameLayout) findViewById(android.R.id.custom);

● Add your custom View by calling addView() on the FrameLayout

○ custom.addView(complexView, new LayoutParams(MATCH_PARENT, MATCH_PARENT);

Dialogs - Date/TimePicker Dialogs

See DatePickerDialogExample

Dialogs - Custom Dialogs - SeekBar

● You can create your own Dialog if the standard Android

Dialogs are not suitable for your needs

● For example, there is no SeekBar Dialog, but you can

create your own

● See CustomDialogExample

Dialogs - DialogFragment

● Creating Dialogs by using the onCreateDialog()

method of an Activity is old school

● Creating Dialogs by using a DialogFragment is new

school

Dialogs - DialogFragment● DialogFragment also has an onCreateDialog()

callback method!

○ i.e., both an Activity and a DialogFragment

have an onCreateDialog() callback method

Dialogs - DialogFragmentDialogFragment is slightly different than the other

Fragments we've seen so far

● We don't need to add it to the XML

● Nor do we need to add it to the UI using a

FragmentTransaction

Dialogs - DialogFragmentpublic class MyActivity extends Activity {

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout. main);

Button button = (Button) findViewById(R.id. button1);

button.setOnClickListener( new OnClickListener() {

@Override

public void onClick(View v) {

MyDialogFragment f = new MyDialogFragment();

f.show(getFragmentManager(), "dialog");

}

});

}

public void doPositiveClick() {

Toast.makeText( this, "doPositiveClick()" , Toast.LENGTH_LONG).show();

}

}

Dialogs - DialogFragmentpublic class MyActivity extends Activity {

@Override public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Button button = (Button) findViewById(R.id.button1);

button.setOnClickListener(new OnClickListener() {

@Override public void onClick(View v) {

MyDialogFragment f = new MyDialogFragment();

f.show(getFragmentManager(), "dialog");

}

});

}

public void doPositiveClick() {

Toast.makeText(this, "doPositiveClick()", Toast.LENGTH_LONG).show();

}

}

Let's create our Activity first ...

Dialogs - DialogFragmentpublic class MyActivity extends Activity {

@Override public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Button button = (Button) findViewById(R.id.button1);

button.setOnClickListener(new OnClickListener() {@Override public void onClick(View v) {

MyDialogFragment f = new MyDialogFragment();

f.show(getFragmentManager(), "dialog");

}

});

}

public void doPositiveClick() {

Toast.makeText(this, "doPositiveClick()", Toast.LENGTH_LONG).show();

}

}

Let's show the Dialog when this Button is clicked!

Dialogs - DialogFragmentpublic class MyActivity extends Activity {

@Override public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Button button = (Button) findViewById(R.id.button1);

button.setOnClickListener(new OnClickListener() {

@Override public void onClick(View v) {

MyDialogFragment f = new MyDialogFragment();

f.show(getFragmentManager(), "dialog");

}

});

}

public void doPositiveClick() {

Toast.makeText(this, "doPositiveClick()", Toast.LENGTH_LONG).show();

}

}

The Button was just clicked at this point, so let's create a new instance of MyDialogFragment, which we will see in a few slides

Dialogs - DialogFragmentpublic class MyActivity extends Activity {

@Override public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Button button = (Button) findViewById(R.id.button1);

button.setOnClickListener(new OnClickListener() {

@Override public void onClick(View v) {

MyDialogFragment f = new MyDialogFragment();

f.show(getFragmentManager(), "dialog");

}

});

}

public void doPositiveClick() {

Toast.makeText(this, "doPositiveClick()", Toast.LENGTH_LONG).show();

}

}

Just call .show() on the Fragment! This time we didn't need to use the FragmentTransaction to add the Fragment

Dialogs - DialogFragmentpublic class MyActivity extends Activity {

@Override public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Button button = (Button) findViewById(R.id.button1);

button.setOnClickListener(new OnClickListener() {

@Override public void onClick(View v) {

MyDialogFragment f = new MyDialogFragment();

f.show(getFragmentManager(), "dialog");

}

});

}

public void doPositiveClick() {

Toast.makeText(this, "doPositiveClick()", Toast.LENGTH_LONG).show();

}

}

Just pass the FragmentManager and it will take care of adding and removing the Fragment for you

Dialogs - DialogFragmentpublic class MyActivity extends Activity {

@Override public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Button button = (Button) findViewById(R.id.button1);

button.setOnClickListener(new OnClickListener() {

@Override public void onClick(View v) {

MyDialogFragment f = new MyDialogFragment();

f.show(getFragmentManager() , "dialog");

}

});

}

public void doPositiveClick() {

Toast.makeText(this, "doPositiveClick()", Toast.LENGTH_LONG).show();

}

}

Second argument is the tag that you want to assign to the Fragment

Dialogs - DialogFragmentpublic class MyActivity extends Activity {

@Override public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Button button = (Button) findViewById(R.id.button1);

button.setOnClickListener(new OnClickListener() {

@Override public void onClick(View v) {

MyDialogFragment f = new MyDialogFragment();

f.show(getFragmentManager() , "dialog");

}

});

}

public void doPositiveClick() {

Toast.makeText(this, "doPositiveClick()", Toast.LENGTH_LONG).show();

}

}

We will get back to this!

Dialogs - DialogFragmentLet's take a look at our DialogFragment

Dialogs - DialogFragmentpublic class MyDialogFragment extends DialogFragment {

@Override

public Dialog onCreateDialog(Bundle savedInstanceState) {

Builder builder = new AlertDialog.Builder(getActivity());

builder.setTitle("This is a DialogFragment!");

builder.setPositiveButton("OK", new OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

MyActivity act = (MyActivity) getActivity();

act.doPositiveClick();

}

});

return builder.create();

}

}

Dialogs - DialogFragmentpublic class MyDialogFragment extends DialogFragment {

@Override

public Dialog onCreateDialog(Bundle savedInstanceState) {

Builder builder = new AlertDialog.Builder(getActivity());

builder.setTitle("This is a DialogFragment!");

builder.setPositiveButton("OK", new OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

MyActivity act= (MyActivity) getActivity();

act.doPositiveClick();

}

});

return builder.create();

}

}

DialogFragment!

Dialogs - DialogFragmentpublic class MyDialogFragment extends DialogFragment {

@Override

public Dialog onCreateDialog(Bundle savedInstanceState) {

Builder builder = new AlertDialog.Builder(getActivity());

builder.setTitle("This is a DialogFragment!");

builder.setPositiveButton("OK", new OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

MyActivity act= (MyActivity) getActivity();

act.doPositiveClick();

}

});

return builder.create();

}

}

Dialog also has an onCreateDialog(), the proof is in the @Override

Dialogs - DialogFragmentpublic class MyDialogFragment extends DialogFragment {

@Override

public Dialog onCreateDialog(Bundle savedInstanceState) {

Builder builder = new AlertDialog.Builder(getActivity());

builder.setTitle("This is a DialogFragment!");

builder.setPositiveButton("OK", new OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

MyActivity act= (MyActivity) getActivity();

act.doPositiveClick();

}

});

return builder.create();

}

}

This is how we get the Context from within a Fragment, remember!?

Dialogs - DialogFragmentpublic class MyDialogFragment extends DialogFragment {

@Override

public Dialog onCreateDialog(Bundle savedInstanceState) {

Builder builder = new AlertDialog.Builder(getActivity());

builder.setTitle("This is a DialogFragment!");

builder.setPositiveButton("OK", new OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

MyActivity act= (MyActivity) getActivity();

act.doPositiveClick();

}

});

return builder.create();

}

}

We need to return a Dialog!

Dialogs - DialogFragmentpublic class MyDialogFragment extends DialogFragment {

@Override

public Dialog onCreateDialog(Bundle savedInstanceState) {

Builder builder = new AlertDialog.Builder(getActivity());

builder.setTitle("This is a DialogFragment!");

builder.setPositiveButton("OK", new OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

MyActivity act= (MyActivity) getActivity();

act.doPositiveClick();

}

});

return builder.create();

}

}

You've seen this other stuff before!

Dialogs - DialogFragmentpublic class MyDialogFragment extends DialogFragment {

@Override

public Dialog onCreateDialog(Bundle savedInstanceState) {

Builder builder = new AlertDialog.Builder(getActivity());

builder.setTitle("This is a DialogFragment!");

builder.setPositiveButton("OK", new OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

MyActivity act= (MyActivity) getActivity();

act.doPositiveClick();

}

});

return builder.create();

}

}

The button in the Dialog has now been clicked! What do we do next?

Dialogs - DialogFragmentpublic class MyDialogFragment extends DialogFragment {

@Override

public Dialog onCreateDialog(Bundle savedInstanceState) {

Builder builder = new AlertDialog.Builder(getActivity());

builder.setTitle("This is a DialogFragment!");

builder.setPositiveButton("OK", new OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

MyActivity act= (MyActivity) getActivity();

act.doPositiveClick();

}

});

return builder.create();

}

}

Let's get a handle on the Activity containing this Fragment

Dialogs - DialogFragmentpublic class MyDialogFragment extends DialogFragment {

@Override

public Dialog onCreateDialog(Bundle savedInstanceState) {

Builder builder = new AlertDialog.Builder(getActivity());

builder.setTitle("This is a DialogFragment!");

builder.setPositiveButton("OK", new OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

MyActivity act= (MyActivity) getActivity();

act.doPositiveClick();

}

});

return builder.create();

}

}

Let's call our own custom method, doPositiveClick() on the Activity

Dialogs - DialogFragmentpublic class MyActivity extends Activity {

@Override public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Button button = (Button) findViewById(R.id.button1);

button.setOnClickListener(new OnClickListener() {

@Override public void onClick(View v) {

MyDialogFragment f = new MyDialogFragment();

f.show(getFragmentManager() , "dialog");

}

});

}

public void doPositiveClick() {

Toast.makeText(this, "doPositiveClick()", Toast.LENGTH_LONG).show();

}

}

Which takes us back here, back to our Activity.

Dialogs - DialogFragmentpublic class MyActivity extends Activity {

@Override public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Button button = (Button) findViewById(R.id.button1);

button.setOnClickListener(new OnClickListener() {

@Override public void onClick(View v) {

MyDialogFragment f = new MyDialogFragment();

f.show(getFragmentManager() , "dialog");

}

});

}

public void doPositiveClick() {

Toast.makeText(this, "doPositiveClick()", Toast.LENGTH_LONG).show();

}

}

Simply make a Toast as evidence that we were successful

Dialogs - DialogFragment

● Note that we don't need to override onCreateView()

or onActivityCreated() methods of a

DialogFragment

● You may choose to override onCreateView() and

return a View if you want to create some custom Dialog

without using onCreateDialog()

● I'll leave it up to the Android developer's website to

explain it if anyone is interested in doing so

Dialogs - DialogFragment

See FragmentDialogExample

Menu Options

● In Android 2.3.x and below, clicking on the dedicated

Menu button allows the user to reveal menu options

● In Android 3.0 and above, the options menu is

presented by way of an action bar

○ The dedicated Menu button is deprecated and some

devices just do not have one

Menu Options - Creating one <= 2.3.x● Right click on your project

● Select New > Android Resource File

● In the Resource Type drop down list, select Menu

● Enter a Filename and click Finish

● Within the <menu> </menu> tags, create a new <item> tag

● Edit the android:id and android:title attributes as

appropriate

● Repeat to add additional menu options

Menu Options - Creating one <= 2.3.xWe will use this Menu XML file, main_menu.xml, for our

example

<?xml version="1.0" encoding="utf-8"?>

<menu xmlns:android="http://schemas.android.com/apk/res/android">

<item android:id="@+id/set_text"

android:title="@string/set_text_opt"/>

<item android:id="@+id/close"

android:title="@string/close_opt" />

</menu>

Menu Options - Creating one <= 2.3.x@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

MenuInflater inflater = getMenuInflater();

inflater.inflate(R.menu.main_menu, menu);

return true;

}

Menu Options - Creating one <= 2.3.x@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

MenuInflater inflater = getMenuInflater();

inflater.inflate(R.menu.main_menu, menu);

return true;

}

Override this Activity method

Menu Options - Creating one <= 2.3.x@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

MenuInflater inflater = getMenuInflater();

inflater.inflate(R.menu.main_menu, menu);

return true;

}

Similar to a LayoutInflater, but for Menus instead

Menu Options - Creating one <= 2.3.x@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

MenuInflater inflater = getMenuInflater();

inflater.inflate(R.menu.main_menu, menu);

return true;

}

Show the Menu now

Menu Options - Creating one <= 2.3.x@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

MenuInflater inflater = getMenuInflater();

inflater.inflate(R.menu.main_menu, menu);

return true;

}

This is the Menu XML file that we created previously

Menu Options - Creating one <= 2.3.x@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

MenuInflater inflater = getMenuInflater();

inflater.inflate(R.menu.main_menu, menu);

return true;

}

This is given as argument to onCreateOptionsMenu, so use it as argument to inflate the menu

Menu Options - Creating one <= 2.3.x@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

MenuInflater inflater = getMenuInflater();

inflater.inflate(R.menu.main_menu, menu);

return true;

}

Return true if you want the menu to be displayed, false if you don't

Menu Options - Creating one <= 2.3.x

● This is enough for the Menu to be displayed on the

screen when the user presses the Menu button

● If you want to take action after an option is selected,

then you need to override the

onOptionsItemSelected() method of Activity

Menu Options - Creating one <= 2.3.x@Override

public boolean onOptionsItemSelected(MenuItem item) {

switch (item.getItemId()) {

case R.id.set_text:

TextView tv = (TextView) findViewById(R.id. textView1);

tv.setText("First Option Selected!" );

break;

case R.id.close:

Toast.makeText(this, "Goodbye!", Toast.LENGTH_LONG).show();

finish();

break;

}

return true;

}

Menu Options - Creating one <= 2.3.x@Override

public boolean onOptionsItemSelected(MenuItem item) {

switch (item.getItemId()) {

case R.id.set_text:

TextView tv = (TextView) findViewById(R.id.textView1);

tv.setText("First Option Selected!");

break;

case R.id.close:

Toast.makeText(this, "Goodbye!", Toast.LENGTH_LONG).show();

finish();

break;

}

return true;

}

We override this method of Activity

Menu Options - Creating one <= 2.3.x@Override

public boolean onOptionsItemSelected(MenuItem item) {

switch (item.getItemId()) {

case R.id.set_text:

TextView tv = (TextView) findViewById(R.id.textView1);

tv.setText("First Option Selected!");

break;

case R.id.close:

Toast.makeText(this, "Goodbye!", Toast.LENGTH_LONG).show();

finish();

break;

}

return true;

}

Which menu item was selected?

Menu Options - Creating one <= 2.3.x@Override

public boolean onOptionsItemSelected(MenuItem item) {

switch (item.getItemId()) {

case R.id.set_text:

TextView tv = (TextView) findViewById(R.id.textView1);

tv.setText("First Option Selected!");

break;

case R.id.close:

Toast.makeText(this, "Goodbye!", Toast.LENGTH_LONG).show();

finish();

break;

}

return true;

}

Here we just changed the text of a TextView when the item R.id.set_text is selected

Menu Options - Creating one <= 2.3.x@Override

public boolean onOptionsItemSelected(MenuItem item) {

switch (item.getItemId()) {

case R.id.set_text:

TextView tv = (TextView) findViewById(R.id.textView1);

tv.setText("First Option Selected!");

break;

case R.id.close:

Toast.makeText(this, "Goodbye!", Toast.LENGTH_LONG).show();

finish();

break;

}

return true;

}

Here we close our app when item R.id.close is selected

Menu Options - Creating one <= 2.3.x

See MenuOptionsExample

Menu Options - Creating one <= 2.3.xYou can change the menu options that show up at runtime

Menu Options - Creating one >= 3.0

For Android 3.0 and higher ...

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

We’ll take a closer look at this when we talk about Material

Design

Context Menu

● You can provide a context menu for any View, but they

are most often used for items in a

○ ListView

○ GridView

○ Other View collections in which the user can perform

direct actions on each item.

Context Menu - Creating one

When creating a Context Menu, you can create

a Menu XML file in the same way you do for an

Options Menu

Context Menu - Creating oneWe will use the following XML file for our example

<?xml version="1.0" encoding="utf-8"?>

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

<item android:id="@+id/edit_option" android:title="Edit"></item>

<item android:id="@+id/share_option" android:title="Share"></item>

<item android:id="@+id/delete_option" android:title="Delete"></item>

</menu>

All of the callback methods in this example are declared within our

ListActivity

Context Menu - Creating oneAs a reminder,

● A ListActivity extends Activity

● It already has a ListView, so you don't need to add

one

● Instead of getting a handle on the ListView by calling

findViewById(R.id.list_view_id)

● You simply call getListView() instead

Context Menu - Creating onepublic class ContextMenuExample extends ListActivity {

String[] entries = new String[] { "Martin", "Anderson", "Junior",

"George", "Dan" };

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

this.setListAdapter(new ArrayAdapter<String>( this,

android.R.layout. simple_list_item_1, entries));

registerForContextMenu(getListView());

}

}

Context Menu - Creating onepublic class ContextMenuExample extends ListActivity {

String[] entries = new String[] { "Martin", "Anderson", "Junior",

"George","Dan"};

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

this.setListAdapter(new ArrayAdapter<String>(this,

android.R.layout.simple_list_item_1, entries));

registerForContextMenu(getListView());

}

}

We will use this String array to populate our List

Context Menu - Creating onepublic class ContextMenuExample extends ListActivity {

String[] entries = new String[] {"Martin", "Anderson", "Junior",

"George", "Dan"};

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

this.setListAdapter(new ArrayAdapter<String>(this,

android.R.layout.simple_list_item_1, entries));

registerForContextMenu(getListView());

}

}

Populate the ListView here

Context Menu - Creating onepublic class ContextMenuExample extends ListActivity {

String[] entries = new String[] {"Martin", "Anderson", "Junior",

"George", "Dan"};

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

this.setListAdapter(new ArrayAdapter<String>(this,

android.R.layout.simple_list_item_1, entries));

registerForContextMenu(getListView());

}

}

Register the ListView with a Context Menu, now the menu will show up when you long press on the ListView

Context Menu - Creating onepublic class ContextMenuExample extends ListActivity {

String[] entries = new String[] { "Martin", "Anderson", "Junior",

"George", "Dan"};

...

@Override

public void onCreateContextMenu(ContextMenu menu, View v,

ContextMenuInfo menuInfo) {

super.onCreateContextMenu(menu, v, menuInfo);

MenuInflater inflater = getMenuInflater();

inflater.inflate(R.menu.context_menu, menu);

}

...

onCreate() from previous slide is here

Context Menu - Creating onepublic class ContextMenuExample extends ListActivity {

String[] entries = new String[] { "Martin", "Anderson", "Junior",

"George", "Dan" };

...

@Override

public void onCreateContextMenu(ContextMenu menu, View v,

ContextMenuInfo menuInfo) {

super.onCreateContextMenu(menu, v, menuInfo);

MenuInflater inflater = getMenuInflater();

inflater.inflate(R.menu.context_menu, menu);

}

...

Override this method. It is called when the Context Menu for View v is being built

Context Menu - Creating onepublic class ContextMenuExample extends ListActivity {

String[] entries = new String[] { "Martin", "Anderson", "Junior",

"George", "Dan" };

...

@Override

public void onCreateContextMenu(ContextMenu menu, View v,

ContextMenuInfo menuInfo) {

super.onCreateContextMenu(menu, v, menuInfo);

MenuInflater inflater = getMenuInflater();

inflater.inflate(R.menu.context_menu, menu);

}

...

You've seen this before

Context Menu - Creating onepublic class ContextMenuExample extends ListActivity {

String[] entries = new String[] { "Martin", "Anderson", "Junior",

"George", "Dan" };

...

@Override

public void onCreateContextMenu(ContextMenu menu, View v,

ContextMenuInfo menuInfo) {

super.onCreateContextMenu(menu, v, menuInfo);

MenuInflater inflater = getMenuInflater();

inflater.inflate(R.menu.context_menu, menu);

}

...

onContextItemSelected() on the next slide goes here

Context Menu - Creating one@Override public boolean onContextItemSelected(MenuItem item) {

AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();

TextView tv = (TextView) getListView().getAdapter().getView(info.position, null,

null);

switch(item.getItemId()) {

case R.id.edit_option:

/* Edit option selected */

break;

case R.id.share_option:

/* Share option selected */

break;

case R.id.delete_option:

/* Edit option selected */

break;

}

return true;

}

Override this method of Activity

Context Menu - Creating one@Override public boolean onContextItemSelected(MenuItem item) {

AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();

TextView tv = (TextView) getListView().getAdapter().getView(info.position, null,

null);

switch(item.getItemId()) {

case R.id.edit_option:

/* Edit option selected */

break;

case R.id.share_option:

/* Share option selected */

break;

case R.id.delete_option:

/* Edit option selected */

break;

}

return true;

}

This Object has information about the Context Menu, NOT the item in the List

Context Menu - Creating one@Override public boolean onContextItemSelected(MenuItem item) {

AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();

TextView tv = (TextView) getListView().getAdapter().getView(info.position, null,

null);

switch(item.getItemId()) {

case R.id.edit_option:

/* Edit option selected */

break;

case R.id.share_option:

/* Share option selected */

break;

case R.id.delete_option:

/* Edit option selected */

break;

}

return true;

}

This Object will have information about the item pressed

Context Menu - Creating one@Override public boolean onContextItemSelected(MenuItem item) {

AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();

TextView tv = (TextView) getListView().getAdapter().getView(info.position, null,

null);

switch(item.getItemId()) {

case R.id.edit_option:

/* Edit option selected */

break;

case R.id.share_option:

/* Share option selected */

break;

case R.id.delete_option:

/* Edit option selected */

break;

}

return true;

}

We can get a handle on the item in the ListView by using info.position

Context Menu - Creating one@Override public boolean onContextItemSelected(MenuItem item) {

AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();

TextView tv = (TextView) getListView().getAdapter().getView(info.position, null,

null);

switch(item.getItemId()) {

case R.id.edit_option:

/* Edit option selected */

break;

case R.id.share_option:

/* Share option selected */

break;

case R.id.delete_option:

/* Edit option selected */

break;

}

return true;

}

info.position tells us which item was pressed, this is how we tell which Menu Item was pressed

Context Menu - Creating one@Override public boolean onContextItemSelected(MenuItem item) {

AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();

TextView tv = (TextView) getListView().getAdapter().getView(info.position, null,

null);

switch(item.getItemId()) {

case R.id.edit_option:

/* Edit option selected */

break;

case R.id.share_option:

/* Share option selected */

break;

case R.id.delete_option:

/* Edit option selected */

break;

}

return true;

}

By combining info.position and item.getItemId(), we know the action needs to be performed on the item

Context Menu - Creating one

See ContextMenuExample

Preferences - SharedPreferences

● SharedPreferences represent 1 of the 5 methods for

Data Storage in Android

● It stores key-value pairs of primitive data types

○ boolean, int, float, long, String

● Data persists even if your app has been fully terminated

Preferences - SharedPreferencesSharedPreferences are only available to app that

created that created them!

Preferences - SharedPreferencespublic class SharedPrefsExample extends Activity {

public static final String PREFS_NAME = "MyPrefsFile";

@Override protected void onCreate(Bundle state){

super.onCreate(state);

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);boolean silent = settings.getBoolean("silentMode", false);setSilent(silent);

}

@Override protected void onStop(){

super.onStop();

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);SharedPreferences.Editor editor = settings.edit();editor.putBoolean("silentMode", mSilentMode);editor.commit();

}}

Preferences - SharedPreferencespublic class SharedPrefsExample extends Activity {

public static final String PREFS_NAME = "MyPrefsFile";

@Override protected void onCreate(Bundle state){

super.onCreate(state);

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);boolean silent = settings.getBoolean("silentMode", false);setSilent(silent);

}

@Override protected void onStop(){

super.onStop();

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);SharedPreferences.Editor editor = settings.edit();editor.putBoolean("silentMode", mSilentMode);editor.commit();

}}

The desired name of your SharedPreferences file

Preferences - SharedPreferencespublic class SharedPrefsExample extends Activity {

public static final String PREFS_NAME = "MyPrefsFile";

@Override protected void onCreate(Bundle state){

super.onCreate(state);

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);boolean silent = settings.getBoolean("silentMode", false);setSilent(silent);

}

@Override protected void onStop(){

super.onStop();

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);SharedPreferences.Editor editor = settings.edit();editor.putBoolean("silentMode", mSilentMode);editor.commit();

}}

You can get a SharedPreferences file by name by calling this method

Preferences - SharedPreferencespublic class SharedPrefsExample extends Activity {

public static final String PREFS_NAME = "MyPrefsFile";

@Override protected void onCreate(Bundle state){

super.onCreate(state);

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);boolean silent = settings.getBoolean("silentMode", false);setSilent(silent);

}

@Override protected void onStop(){

super.onStop();

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);SharedPreferences.Editor editor = settings.edit();editor.putBoolean("silentMode", mSilentMode);editor.commit();

}}

The second argument is the mode

Preferences - SharedPreferencespublic class SharedPrefsExample extends Activity {

public static final String PREFS_NAME = "MyPrefsFile";

@Override protected void onCreate(Bundle state){

super.onCreate(state);

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);boolean silent = settings.getBoolean("silentMode", false);setSilent(silent);

}

@Override protected void onStop(){

super.onStop();

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);SharedPreferences.Editor editor = settings.edit();editor.putBoolean("silentMode", mSilentMode);editor.commit();

}}

If the SharedPreferences file doesn't exist at this point, it will be created for you

Preferences - SharedPreferencespublic class SharedPrefsExample extends Activity {

public static final String PREFS_NAME = "MyPrefsFile";

@Override protected void onCreate(Bundle state){

super.onCreate(state);

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);boolean silent = settings.getBoolean("silentMode", false);setSilent(silent);

}

@Override protected void onStop(){

super.onStop();

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);SharedPreferences.Editor editor = settings.edit();editor.putBoolean("silentMode", mSilentMode);editor.commit();

}}

Try to get the boolean value "silentMode", "silentMode" is the key. You decide on the name of the key. "silentMode" is not a keyword here

Preferences - SharedPreferencespublic class SharedPrefsExample extends Activity {

public static final String PREFS_NAME = "MyPrefsFile";

@Override protected void onCreate(Bundle state){

super.onCreate(state);

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);boolean silent = settings.getBoolean("silentMode", false);setSilent(silent);

}

@Override protected void onStop(){

super.onStop();

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);SharedPreferences.Editor editor = settings.edit();editor.putBoolean("silentMode", mSilentMode);editor.commit();

}}

If the key doesn't exist (could be because the file was just created in the previous line of code), then this will be the value returned

Preferences - SharedPreferencespublic class SharedPrefsExample extends Activity {

public static final String PREFS_NAME = "MyPrefsFile";

@Override protected void onCreate(Bundle state){

super.onCreate(state);

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);boolean silent = settings.getBoolean("silentMode", false);setSilent(silent);

}

@Override protected void onStop(){

super.onStop();

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);SharedPreferences.Editor editor = settings.edit();editor.putBoolean("silentMode", mSilentMode);editor.commit();

}}

An imaginary method that you created to change the volume setting of the device to silent

Preferences - SharedPreferencespublic class SharedPrefsExample extends Activity {

public static final String PREFS_NAME = "MyPrefsFile";

@Override protected void onCreate(Bundle state){

super.onCreate(state);

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);boolean silent = settings.getBoolean("silentMode", false);setSilent(silent);

}

@Override protected void onStop(){

super.onStop();

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);SharedPreferences.Editor editor = settings.edit();editor.putBoolean("silentMode", mSilentMode);editor.commit();

}}

We want data to persist even after the app has been terminated, so let's Override onStop()

Preferences - SharedPreferencespublic class SharedPrefsExample extends Activity {

public static final String PREFS_NAME = "MyPrefsFile";

@Override protected void onCreate(Bundle state){

super.onCreate(state);

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);boolean silent = settings.getBoolean("silentMode", false);setSilent(silent);

}

@Override protected void onStop(){

super.onStop();

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);SharedPreferences.Editor editor = settings.edit();editor.putBoolean("silentMode", mSilentMode);editor.commit();

}}

Get a handle on our SharedPreferences again, which should have the "silentMode" value set at this point

Preferences - SharedPreferencespublic class SharedPrefsExample extends Activity {

public static final String PREFS_NAME = "MyPrefsFile";

@Override protected void onCreate(Bundle state){

super.onCreate(state);

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);boolean silent = settings.getBoolean("silentMode", false);setSilent(silent);

}

@Override protected void onStop(){

super.onStop();

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);SharedPreferences.Editor editor = settings.edit();editor.putBoolean("silentMode", mSilentMode);editor.commit();

}}

If we want to modify the SharedPreferences, we need to use a SharedPreferences Editor

Preferences - SharedPreferencespublic class SharedPrefsExample extends Activity {

public static final String PREFS_NAME = "MyPrefsFile";

@Override protected void onCreate(Bundle state){

super.onCreate(state);

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);boolean silent = settings.getBoolean("silentMode", false);setSilent(silent);

}

@Overrideprotected void onStop(){

super.onStop();

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);SharedPreferences.Editor editor = settings.edit();editor.putBoolean("silentMode", mSilentMode);editor.commit();

}}

Let's set the value value of silentMode to the imaginary boolean value mSilentMode

Preferences - SharedPreferencespublic class SharedPrefsExample extends Activity {

public static final String PREFS_NAME = "MyPrefsFile";

@Override protected void onCreate(Bundle state){

super.onCreate(state);

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);boolean silent = settings.getBoolean("silentMode", false);setSilent(silent);

}

@Override protected void onStop(){

super.onStop();

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);SharedPreferences.Editor editor = settings.edit();editor.putBoolean("silentMode", mSilentMode);editor.commit();

}}

Don't forget to save your changes to the file!

Preferences - SharedPreferences

See SharedPrefsExample

Preferences - PreferenceActivity● If you want to provide the user with a UI for changing

preferences, you can use a PreferenceActivity in

combination with SharedPreferences

● To create a PreferenceActivity, first create a

Preference XML file

Preferences - PreferenceActivity● File > New > Android Resource File

● Resource Type: XML

● Enter the file name, e.g. preferences.xml

● This creates a file in the /res/xml folder

○ Ensure the preferences.xml file has a

<PreferenceScreen> as the root element

● Add the various types of preferences as necessary

○ e.g. EditTextPreference, CheckBoxPreference, …

● Set the attributes for each preference as necessary

Preferences - PreferenceActivityWe will use this preferences.xml file for our example

<?xml version="1.0" encoding="utf-8"?>

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

<EditTextPreference android:dialogTitle="Username"

android:dialogMessage="Please enter your Username"

android:summary="Username for logging in to this app" android:title="Username"

android:key="username"/>

<CheckBoxPreference android:summaryOff="I do not want your spam"

android:key="spam" android:title="Spam"

android:summaryOn="Sign me up for spam"/>

</PreferenceScreen>

Preferences - PreferenceActivityCreating a PreferenceActivity is easy!

Preferences - PreferenceActivity

public class Preferences extends PreferenceActivity {

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

addPreferencesFromResource(R.xml.preferences);

}

}

Preferences - PreferenceActivity

public class Preferences extends PreferenceActivity {

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

addPreferencesFromResource(R.xml.preferences);

}

}

Extend PreferenceActivity

Preferences - PreferenceActivity

public class Preferences extends PreferenceActivity {

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

addPreferencesFromResource(R.xml.preferences);

}

}

From the preferences.xml file we added previously

Preferences - PreferenceActivityIn your main Activity, you can get the Preferences

without specifying the name of the XML file

Preferences - PreferenceActivity

public class MainActivity extends Activity {

SharedPreferences mPrefs;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

mPrefs = PreferenceManager.getDefaultSharedPreferences(

getBaseContext());

String username = mPrefs.getString( "username", "None");

}

}

Preferences - PreferenceActivity

public class MainActivity extends Activity {

SharedPreferences mPrefs;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

mPrefs = PreferenceManager.getDefaultSharedPreferences(

getBaseContext());

String username = mPrefs.getString("username","None");

}

}

This will allow you to access the preference settings, even if you have more than one preference XML file associated with a PreferenceActivity

Preferences - PreferenceActivity

public class MainActivity extends Activity {

SharedPreferences mPrefs;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

mPrefs = PreferenceManager.getDefaultSharedPreferences(

getBaseContext());

String username = mPrefs.getString("username","None");

}

}

These preferences will automatically save when the user interacts with them!

Preferences - PreferenceActivity

See PreferenceActivityExample

Preferences - PreferenceActivity

● You can also add a Listener for when a

Preference has been changed

● When a Preference is changed, you may

need to update certain values tied to these

Preferences

Preferences - PreferenceFragment

Android 3.0 and higher

PreferenceFragment

References

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

● Android Developers● The Mobile Lab at Florida State University