Im heutigen Tutorial wird die Struktur des Projektes angepasst und modularisiert, damit die Programmierung im weiteren Verlauf der Tutorialreihe effizienter und mit weniger Arbeit verläuft. Dazu werden einige Methoden und innere Klassen in eigene neue Klassen ausgelagert. Der Code kann dann einfacher verwendet und erweitert werden.
Einteilung in Packages
Als erstes erstellst du im Java-Verzeichnis des Projektes ein neues Package, indem du mit rechts auf den Ordner "de.smarthome_blogger.smarthome" klickst und "New -> Package" wählst. Gib dem Package den Namen "system" und klicke auf "OK". Verschiebe nun die Klassen "HTTPRequest", "SaveData" und "Icons" in das neue Paket. In dem Fenster, das sich nun öffnet, klickst du auf "Refactor".Eigene Klasse für Dialoge und Fehlermeldungen
Jetzt erstellst du im Package "system" die Klasse "Dialogs". Dazu klickst du das Package mit rechts an und wählst "New -> Java Class". Trage den Namen ein und klicke auf "OK". In der Klasse "Dialogs", wird die Methode fehlermeldung() erstellt, die als Parameter einen String und eine View erhält. Die Methode erstellt eine Snackbar und zeigt die übergebene Nachricht in der übergebenen View an:/**
* Stellt die angegebene Nachricht in einer Snackbar dar
* @param msg die Nachricht
* @param v die View, in der die Nachricht angezeigt werden soll
*/
public static void fehlermeldung(String msg, View v){
Snackbar.make(v, msg, Snackbar.LENGTH_SHORT).show();
}
usernameField.setError(Dieser Nutzer existiert nicht);
//Eingaben auf Vollständigkeit prüfen
if(username.equals("")){
usernameField.setError("Bitte gib deinen Nutzernamen ein");
}
else if(password.equals("")){
passwordField.setError("Bitte gib dein Passwort ein");
}
else if(serverIp.equals("")){
serverIpField.setError("Bitte gib die Adresse des Servers ein");
}
else{
login(username, password, serverIp, saveLogin.isChecked());
}
Items und Adapter auslagern
Nun wird ein weiteres Package erstellt. Klicke dazu wieder mit rechts auf das Hauptpaket und wähle "New -> Package". Gib dem Paket den Namen "adapters" und klicke auf "OK". In diesem Paket wird nun eine neue Klasse namens "RoomAdapter" erstellt. Öffne die Klasse "RoomFragment" und schneide die Klasse "RoomAdapter" daraus aus. Mit dem ausgeschnittenem Code ersetzt du nun in der neu angelegten Klasse diesen Codeblock:public class RoomAdapter{
}
boolean setState = false;
ArrayList<RoomItem> roomItems;
Activity activity;
Context context;
View view;
public RoomAdapter(ArrayList<RoomItem> roomItems, Activity activity,
Context context, View view){
this.roomItems = roomItems;
this.activity = activity;
this.context = context;
this.view = view;
}
public class RoomItem{
}
this.room = room;
/**
* Gibt den Raum des Gerätes zurück
* @return
*/
public String getRoom(){
return room;
}
import de.smarthome_blogger.smarthome.items.RoomItem;
import de.smarthome_blogger.smarthome.adapters.RoomAdapter;
roomAdapter = new RoomAdapter(roomItems, getActivity(), getContext(),
roomView.findViewById(R.id.frame));
import de.smarthome_blogger.smarthome.RoomFragment;
import de.smarthome_blogger.smarthome.items.RoomItem;
public class SettingItem{
}
public class SettingAdapter{
}
import de.smarthome_blogger.smarthome.adapters.SettingAdapter;
import de.smarthome_blogger.smarthome.items.SettingItem;
ArrayList<SettingItem> settingItems;
Context context;
public SettingAdapter(ArrayList<SettingItem> settingItems, Context context){
this.settingItems = settingItems;
this.context = context;
}
//So sollte der Aufruf nun aussehen
settingsAdapter = new SettingAdapter(settingItems, getContext());
boolean setState = false;
/**
* Schaltet das Gerät device auf den Zustand mode
* @param item
* @param mode
*/
public void setModes(final RoomItem item, boolean mode){}
/**
* Zeigt den Graphen für den Sensor sensor an
* @param type
* @param sensor
*/
public void showOverview(String type, String sensor){}
/**
* Heizungs-Menü öffnen
*/
public void openHeatingDialog(){}
/**
* Szenen-Menü öffnen
*/
public void openSceneMenu(){}
Steuerungsmethoden in eigene Klasse auslagern
Die Methoden, mit denen Geräte gesteuert werden, werden in eine neue Klassen namens "RoomControl" ausgelagert. Erstelle dazu im Paket "system" die Klasse "RoomControl" und öffne sie. Erstelle darin die Methode setModes():/**
* Schaltet das angegebene Gerät auf den Zustand mode
* @param v die View
* @param activity die aufrufende Activity
* @param item das Item
* @param indexOfItem der Index des Items
* @param mode der Zustand, auf den das item geschaltet werden soll
* @param notifyListener der NotifyListener
*/
public static void setModes(final View v, Activity activity, final RoomItem item,
final int indexOfItem,final boolean mode, final OnAdapterNotifyListener notifyListener){}
public interface OnAdapterNotifyListener{
void onNotify(int i);
}
/**
* Öffnet die Heizungssteuerung
*/
public static void openHeatingDialog(){}
/**
* Öffnet das Szenenmenü
*/
public static void openSceneMenu(){}
/**
* Zeigt den Graphen für den übergebenen Sensor an
* @param activity aufrufende Activity
* @param item das Item
* @param location der Ort des Items
*/
public static void showOverview(Activity activity, RoomItem item, String location){}
RoomControl.setModes(view, activity, ri, i, !switchViewHolder.switchView.isChecked(),
new RoomControl.OnAdapterNotifyListener() {
@Override
public void onNotify(int i) {
notifyItemChanged(i);
}
});
RoomControl.showOverview(activity, ri, ri.getRoom());
import de.smarthome_blogger.smarthome.system.RoomControl;
Dieser Beitrag hat dir gefallen?
Dann abonniere doch unseren Newsletter!