200 likes | 306 Views
GUI og XML programmering. Hvor meget kode og hvor meget XML?. Agenda. Clicker applikation med knapper i stede for ListActivity ! Applikation med flere A ctivities og V iews Data fra en Activity til en anden Forberedelse til RESTFul service opslag
E N D
GUI og XML programmering Hvormegetkodeoghvormeget XML?
Agenda • Clicker applikation med knapper i stede for ListActivity! • Applikation med flere Activities og Views • Data fra en Activity til en anden • Forberedelse til RESTFul service opslag • Brug af Android Service ->Tilføjelse af Android Preferences (Host adresse)
Motivation Sådan en apps skal vi også have
Android Application Class • Svarer ”nogenlunde” til J2ME Midlet • “Base class for those who need to maintain global application state. You can provide your own implementation by specifying its name in your AndroidManifest.xml's <application> tag, which will cause that class to be instantiated for you when the process for your application/package is created.” • Kan håndtereronCreate, onTerminate, onLowMemoryogonConfigurationChanged events
Eksempel Applicationclass // ** The ApplicationClass *************************************** // // ApplictionClassExtenstion import android.app.Application; import android.content.res.Configuration; public classMyApplicationextendsApplication { private staticMyApplication singleton; // Returns the applicationinstance public staticMyApplicationgetInstance() { return singleton; } @Override public final voidonCreate() { super.onCreate(); singleton = this; } } // Manifest entry <application android:icon="@drawable/icon" android:name="MyApplication"> [... Manifestnodes ...] </application>
Android Activity Class (Android Activities) • Brugergrænseflade og brugeraktioner er en aktivitet // ** The ActivityClass ****************************************** // packagecom.paad.myapplication; import android.app.Activity; import android.os.Bundle; public classMyActivityextendsActivity { /** Calledwhen the activity is firstcreated. */ @Override public voidonCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); } } // ** Activity layout in XML <activityandroid:label="@string/app_name" android:name=".MyActivity"> </activity>
Activity bruger View og Layout til UI og interaktion med brugeren • Activity og Form svarer til hinanden: Præsentere et skærmbillede 1:1 • Activity bruger Views, Layout og Widgets/Controls (Standard eller egne) • Der findes en sæt af specielt designede Activities i forhold til standard widgets • MapActivty, List Activty, ExpandableListActivty og TabActivity • Tilstand styret af Android Framework. • Mange Activities i en applikation kan give behov for eget Application objekt. Screen Layout “This hierarchy tree can be as simple or complex as you need it to be, and you can build it up using Android's set of predefined widgets and layouts, or with custom Views that you create yourself”.
Activity ->Layout-> View -> Widget &| ->UI Control • View er adgangen til skærmressourcen på enheden • Layout er manageren, der kontrollere View opsætningen • Widget er en kontrol i View, og som ligner den rigtige verdens ting. Et ur eller et kompas. Kan også være et View • UI control er grafiske enheder som knapper eller ”gestures” @Override public voidonCreate(Bundleicicle) { super.onCreate(icicle); TextViewmyTextView = new TextView(this); setContentView(myTextView); myTextView.setText("Hello, Android"); } @Override public voidonCreate(Bundleicicle) { super.onCreate(icicle); setContentView(R.layout.main); TextViewmyTextView = (TextView)findViewById(R.id.myTextView); }
Klassediagram Et eksempel Fra http://www.droidnova.com/playing-with-graphics-in-android-part-i,147.html
Layout hvordan XML ogkode <?xml version="1.0" encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="EnterTextBelow" /> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="TextGoesHere!" /> </LinearLayout> LinearLayoutll = new LinearLayout(this); ll.setOrientation(LinearLayout.VERTICAL); TextViewmyTextView = new TextView(this); EditTextmyEditText = new EditText(this); myTextView.setText("EnterTextBelow"); myEditText.setText("TextGoesHere!"); intlHeight = LinearLayout.LayoutParams.FILL_PARENT; intlWidth = LinearLayout.LayoutParams.WRAP_CONTENT; ll.addView(myTextView, new LinearLayout.LayoutParams(lHeight, lWidth)); ll.addView(myEditText, new LinearLayout.LayoutParams(lHeight, lWidth)); setContentView(ll);
Hvad er der så at holde styr på i GUI’en?http://developer.android.com/guide/topics/ui/index.html • View http://developer.android.com/reference/android/view/View.html • ViewGrouphttp://developer.android.com/reference/android/view/ViewGroup.html • Layout http://developer.android.com/reference/android/widget/LinearLayout.html • Widget Package http://developer.android.com/reference/android/widget/package-summary.html • Menu http://developer.android.com/guide/topics/ui/menus.html(Menu knappen) • View properties: Statiskog/ellerdynamisk. • UI Events • Define an event listener and register it with the View • Override an existing callback method for the View (Custom Views) • Menu Events
Event Listnershttp://tseng-blog.nge-web.net/blog/2009/02/14/implementing-listeners-in-your-android-java-application/ • Inline Clas Implementation • Bruge “Implements” metoden • Bruge en variabeltil en listnermetode • XML attribute android:onClick="click1” • Sørg for at have en void click1(View v){ …} i Activity
Event Listnershttp://tseng-blog.nge-web.net/blog/2009/02/14/implementing-listeners-in-your-android-java-application/ • Inline Clas Implementation • Bruge “Implements” metoden • Bruge en variabeltil en listnermetode • XML attribute android:onClick="click1” • Sørg for at have en void click1(View v){ …} metode i Activity
Data fra en Activity til en anden I samme Apps ? I forskellige Apps? Påforskellige Smartphones Intent og Events Content Provider Shared Preferences SQLLite Filsystemet En extern server ??
Samme App Intentintent = newIntent(); intent.putExtra(BackDoorMan.REQ_Q_A, mes); intent.setClassName("dk.euc.clicker", "dk.euc.clicker.SecActivtity"); try { startActivity(intent); } catch (Exception e) { @Override protectedvoidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.clicker); question = getIntent().getExtras().getString(BackDoorMan.REQ_Q_A);
Preferences og opsætning ErtilknyttetegenAcitivity en xml filog “hooks” i Preferences publicclass Preferences extendsPreferenceActivity { publicstaticfinal String PREF_CLICKER_HOST = "PREF_CLICKER_HOST"; SharedPreferencesprefs; @Override publicvoidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.samplepreferences); } } <PreferenceScreenxmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategoryandroid:title="@string/sample_pref_categ_3"> <EditTextPreferenceandroid:key="PREF_CLICKER_HOST" android:title="@string/sample_pref_txt_dialog" android:dialogTitle="@string/sample_pref_txt_dialog" android:summary="Preference Summary" /> </PreferenceCategory> </PreferenceScreen>
Preferences internt opret // Retrieve an editor to modify the shared preferences. SharedPreferences.Editor editor = mySharedPreferences.edit(); // Store new primitive types in the shared preferences object. editor.putBoolean("isTrue", true); editor.putFloat("lastFloat", 1f); editor.putInt("wholeNumber", 2); editor.putLong("aNumber", 3l); editor.putString("textEntryValue", "Not Empty"); // Commit the changes. editor.commit();
Preferences internt læs public voidloadPreferences() { // Get the storedpreferences int mode = Activity.MODE_PRIVATE; SharedPreferencesmySharedPreferences = getSharedPreferences(MY_PREFS, mode); // Retrieve the savedvalues. booleanisTrue = mySharedPreferences.getBoolean("isTrue", false); floatlastFloat = mySharedPreferences.getFloat("lastFloat", 0f); intwholeNumber = mySharedPreferences.getInt("wholeNumber", 1); long aNumber = mySharedPreferences.getLong("aNumber", 0); StringstringPreference = mySharedPreferences.getString("textEntryValue", ""); }