700 likes | 840 Views
Mobile Programming Lecture 4. Resources, Selection, Activities, Intents . Announcement. Reminder: Homework 2 is due this Friday 11:59pm. You need to demo to me in class. The second deadline is Sunday 11:59pm. You need to demo to me in Monday’s class.
E N D
Mobile Programming Lecture 4 Resources, Selection, Activities, Intents
Announcement • Reminder: • Homework 2 is due this Friday 11:59pm. You need to demo to me in class. • The second deadline is Sunday 11:59pm. You need to demo to me in Monday’s class. • Please export your project (.zip) and email me. • Midterm exam is on June 21st. It is a Friday.
Lecture 3 Review • Why shouldn't you use Toast to debug? • How should you debug?
Agenda Referencing @string resources • Setters and Getters • Selection Views • Android Components - Activity • Intents • More on the Android Manifest File
Referencing @string Resources All @string Resources are stored in res/values/strings.xml You reference them in XML as "@string/string_name"
Referencing @string Resources You can also reference them in Java String buttonText = ""; Resources res = getResources(); buttonText = res.getString(R.string.string_name);
Referencing Resources You can store an array of strings if you need a collection instead of just a single string. This makes it an @array resource instead of @string resource! • Open res/values/strings.xml in Resources view • Add ... > String Array • enter the name of the string_array, e.g. "countries" • Repeat until you've added all values for the collection ... • Add ... > Item • Enter the name of the item
Setters and Getters for Views Most of a View's attributes can be set and get programmatically
Selection Widgets - Spinner Similar to a drop-down list • android:spinnerMode • "dialog" or "dropdown" • android:prompt • e.g. "Select an option" • message to display when the spinner dialog is shown • only when android:spinnerMode="dialog" • android:entries • e.g. "@array/countries" • populate the spinner using this array
Selection Widgets - Spinner Similar to a drop-down list • android:prompt • e.g. "Select an option" • message to display when the spinner dialog is shown • android:spinnerMode • "dialog" or "dropdown" • android:entries • e.g. "@array/countries" • populate the spinner using this array If the list is static, you can again avoid Java by specifying the entries in XML!
Selection Widgets - Spinner Similar to a drop-down list • android:prompt • e.g. "Select an option" • message to display when the spinner dialog is shown • android:spinnerMode • "dialog" or "dropdown" • android:entries • e.g. "@array/countries" • populate the spinner using this array If you don't like XML, you can set the entries in Java also.
Selection Widgets - Spinner public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Spinner spinner = (Spinner) findViewById(R.id.my_spinner); ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.countries, android.R.layout.simple_spinner_item); mySpinner.setAdapter(adapter); }
Selection Widgets - Spinner public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Spinner spinner = (Spinner) findViewById(R.id.my_spinner); ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.countries, android.R.layout.simple_spinner_item); mySpinner.setAdapter(adapter); } This is the Java code. If you choose to do this, then you don't need to set the android:entries attribute
Selection Widgets - Spinner public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Spinner spinner = (Spinner) findViewById(R.id.my_spinner); ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.countries, android.R.layout.simple_spinner_item); mySpinner.setAdapter(adapter); } You should already know what this does.
Selection Widgets - Spinner public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Spinner spinner = (Spinner) findViewById(R.id.my_spinner); ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.countries, android.R.layout.simple_spinner_item); mySpinner.setAdapter(adapter); } Since you don't like XML, to do it programmatically, you need to use an Adapter.
Selection Widgets - Spinner public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Spinner spinner = (Spinner) findViewById(R.id.my_spinner); ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.countries, android.R.layout.simple_spinner_item); mySpinner.setAdapter(adapter); } This is Java stuff. If you don't know what it is, try removing it to see what happens.
Selection Widgets - Spinner public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Spinner spinner = (Spinner) findViewById(R.id.my_spinner); ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.countries, android.R.layout.simple_spinner_item); mySpinner.setAdapter(adapter); } If you have an @array resource already, then create an ArrayAdapter from that resource.
Selection Widgets - Spinner public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Spinner spinner = (Spinner) findViewById(R.id.my_spinner); ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.countries, android.R.layout.simple_spinner_item); mySpinner.setAdapter(adapter); } First argument is of type Context, you can just past the "this" keyword here (because of the state of app)
Selection Widgets - Spinner public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Spinner spinner = (Spinner) findViewById(R.id.my_spinner); ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.countries, android.R.layout.simple_spinner_item); mySpinner.setAdapter(adapter); } This is the resource that you're creating the ArrayAdapter from.
Selection Widgets - Spinner public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Spinner spinner = (Spinner) findViewById(R.id.my_spinner); ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.countries, android.R.layout.simple_spinner_item); mySpinner.setAdapter(adapter); } 3rd argument expects the @id of a TextView.
Selection Widgets - Spinner public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Spinner spinner = (Spinner) findViewById(R.id.my_spinner); ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.countries, android.R.layout.simple_spinner_item); mySpinner.setAdapter(adapter); } android.R gives you resources that exist for use even before you create your app
Selection Widgets - Spinner public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Spinner spinner = (Spinner) findViewById(R.id.my_spinner); ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.countries, android.R.layout.simple_spinner_item); mySpinner.setAdapter(adapter); } So instead of creating and using your own TextView for this purpose, use this one
Selection Widgets - Spinner public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Spinner spinner = (Spinner) findViewById(R.id.my_spinner); ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.countries, android.R.layout.simple_spinner_item); mySpinner.setAdapter(adapter); } Attach the Adapter to the Spinner in order to populate the Spinner!
Selection Widgets - Spinner public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Spinner spinner = (Spinner) findViewById(R.id.my_spinner); ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.countries, android.R.layout.simple_spinner_item); adapter.setDropDownViewResource (android.R.layout.simple_spinner_dropdown_item); mySpinner.setAdapter(adapter); } Finally, this line of code is not required, but it makes your drop down look pretty.
Selection Widgets - Spinner Both ways give you a Spinner which uses predetermined entries How do you populate the Spinner at runtime, with when the entries are also determined at runtime?
Selection Widgets - Spinner public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Spinner spinner = (Spinner) findViewById(R.id.my_spinner); String[] countries = new String[]{"Brazil","China","Denmark"}; ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, countries); mySpinner.setAdapter(adapter); }
Selection Widgets - Spinner public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Spinner spinner = (Spinner) findViewById(R.id.my_spinner); String[] countries = new String[]{"Brazil","China","Denmark"}; ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, countries); mySpinner.setAdapter(adapter); } Create and initialize a String array
Selection Widgets - Spinner public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Spinner spinner = (Spinner) findViewById(R.id.my_spinner); String[] countries = new String[]{"Brazil","China","Denmark"}; ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, countries); mySpinner.setAdapter(adapter); } Create an ArrayAdapter to populate the Spinner with
Selection Widgets - Spinner public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Spinner spinner = (Spinner) findViewById(R.id.my_spinner); String[] countries = new String[]{"Brazil","China","Denmark"}; ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, countries); mySpinner.setAdapter(adapter); } 3rd argument accepts a List of Strings
Selection Widgets - ListView A ListView is similar to a Spinner • they both show the user a list of items • they both have the android:entries attribute, so they can both be set using the same @array resource or the same ArrayAdapter
Selection Widgets - ListView • Adapters are used to provide the data to the ListView object. • The adapter also defines how each row is the ListView is displayed. • You can use pre-existing layout for each row. • You can also define customized layout for each row. • Extends BaseAdapter class.
Selection Widgets - ListView A ListView is similar to a Spinner with some exceptions, to name a few: • A Spinner is normally used for forms, a ListView not so much • A Spinner only shows one item at a time • A Spinner item can be "selected", a ListView item can be "clicked" or "selected"
Selection Widgets - ListView A ListView is similar to a Spinner with some exceptions, to name a few: • A Spinner is normally used for forms, a ListView not so much • A Spinner only shows one item at a time • A Spinner item can be "selected", a ListView item can be "clicked" or "selected" I added this in hindsight. On non-trouch-screen devices it can be selected
Events - Spinner OnItemSelected You can set an EventListener for when the user selects an item from the Spinner
Events - Spinner OnItemSelected mySpinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(getApplicationContext(), ((TextView) view).getText() , Toast.LENGTH_SHORT).show(); } @Override public void onNothingSelected(AdapterView<?> parent) { Toast.makeText(getApplicationContext(), "You didn't select anything" , Toast.LENGTH_SHORT).show(); } });
Events - Spinner OnItemSelected Setter method for setting the EventListener mySpinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(getApplicationContext(), ((TextView) view).getText() , Toast.LENGTH_SHORT).show(); } @Override public void onNothingSelected(AdapterView<?> parent) { Toast.makeText(getApplicationContext(), "You didn't select anything" , Toast.LENGTH_SHORT).show(); } });
Events - Spinner OnItemSelected Anonymous class mySpinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(getApplicationContext(), ((TextView) view).getText() , Toast.LENGTH_SHORT).show(); } @Override public void onNothingSelected(AdapterView<?> parent) { Toast.makeText(getApplicationContext(), "You didn't select anything" , Toast.LENGTH_SHORT).show(); } });
Events - Spinner OnItemSelected When an item is selected ..., mySpinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(getApplicationContext(), ((TextView) view).getText() , Toast.LENGTH_SHORT).show(); } @Override public void onNothingSelected(AdapterView<?> parent) { Toast.makeText(getApplicationContext(), "You didn't select anything" , Toast.LENGTH_SHORT).show(); } });
Events - Spinner OnItemSelected You can now reference the actual View (i.e., each entry in Spinner is a TextView) mySpinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(getApplicationContext(), ((TextView) view).getText() , Toast.LENGTH_SHORT).show(); } @Override public void onNothingSelected(AdapterView<?> parent) { Toast.makeText(getApplicationContext(), "You didn't select anything" , Toast.LENGTH_SHORT).show(); } });
Events - Spinner OnItemSelected The position of the view in the Adapter mySpinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(getApplicationContext(), ((TextView) view).getText() , Toast.LENGTH_SHORT).show(); } @Override public void onNothingSelected(AdapterView<?> parent) { Toast.makeText(getApplicationContext(), "You didn't select anything" , Toast.LENGTH_SHORT).show(); } });
Events - Spinner OnItemSelected The android:id attribute of the view mySpinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(getApplicationContext(), ((TextView) view).getText() , Toast.LENGTH_SHORT).show(); } @Override public void onNothingSelected(AdapterView<?> parent) { Toast.makeText(getApplicationContext(), "You didn't select anything" , Toast.LENGTH_SHORT).show(); } });
Events - Spinner OnItemSelected mySpinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(getApplicationContext(), ((TextView) view).getText() , Toast.LENGTH_SHORT).show(); } @Override public void onNothingSelected(AdapterView<?> parent) { Toast.makeText(getApplicationContext(), "You didn't select anything" , Toast.LENGTH_SHORT).show(); } }); Cast the generic View to a TextView
Events - Spinner OnItemSelected mySpinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(getApplicationContext(), ((TextView) view).getText() , Toast.LENGTH_SHORT).show(); } @Override public void onNothingSelected(AdapterView<?> parent) { Toast.makeText(getApplicationContext(), "You didn't select anything" , Toast.LENGTH_SHORT).show(); } }); Get the android:text value
Events - Spinner OnItemSelected • Note that this we're using the OnItemSelectedListener instead of the OnItemClickListener for Spinner! • If you try to use OnItemClickListener you may get errors • Also, note the difference between these two listeners and OnClickListener • OnItemClickListener • an entry in the Spinner has been clicked, don't use this • OnClickListener • the Spinner has been clicked • OnItemSelectedListener • an entry in the Spinner has been selected
Events - ListView OnItemClick As mentioned before, a ListView item can be clicked, or selected In that case, you use OnItemClickListener for ListView or OnItemSelected Listener
Events - ListView OnItemClick myListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(getApplicationContext(), ((TextView) view).getText(), Toast.LENGTH_SHORT).show(); } });
Android Application Components So far we've only been working with 1 of the 4 Android components, namely Activity
Android Application Components The 4 Android application components are • Activity • Broadcast Receiver • Content Provider • Service
Activity So far we've only been working with a single Activity Remember, an Activity is a single screen with a user interface Each Activity in an application is independent
Activity An Activity is the only Android application component with a UI!