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 - 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 - 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 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 - 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 - 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
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 >= 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
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 - 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 - 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
● 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