Android Hava Durumu Uygulaması :MobileCoder I MobileCoder.NET I Mobil Programlama I Android Programlama I Mobil Geliştiricilerin Buluşma Noktası I www.MobileCoder.Net

Android Hava Durumu Uygulaması

03.04.2015 tarihinde Android Programlama kategorisine eklenmiş, 1.752 views Kişi Okumuş ve 0 Yorum Yapılmış.

Android Hava Durumu Uygulaması Oluşturma

Basit bir kullanıcı arayüzüne sahip, kullanıcının bir hava durumunda aradığı herşeyin yer aldığı bir uygulama geliştireceğiz.

ÖN KOŞULLAR

Projeyi Oluşturma

1. Uygulamaya Hava Durumu adını veriyoruz. İstediğiniz herhangi bir ad verebilirsiniz.

havadurumuproje

 

2.Minimum SDK’yı seçin.

3.Blank Activity’i seçin.

Custom Font Ekleme

Eğer Android Studio kullanıyorsanız şu yolları izlemeleyelim.

1.”app”e sağ tıklayarak yeni bir Assets Folder oluşturun.dfghj2. “assets”e sağ tıklayarak yeni bir Directory oluşturun.wr

3.”kaynak” ismini verin.

ujklş

 

4.Daha önceden indirmiş olduğumuz “weathericons-regular-webfont.ttf”nin adını “weather.ttf” şeklinde değiştirerek assets > kaynak klasörünün içine atın.

dfghjyjk

 

Manifest Düzenlemesi

Bu uygulamanın gerektirdiği tek izin android.permission.INTERNETdir. manifest > “AndroidManifest.xml”i açın ve aşağıdakini ekleyelim.

<uses-permission android:name=”android.permission.INTERNET”/>

Manifest’in activity düğümü şu şekilde olmalıdır: 

1.  <activity2.  android:name=”.MainActivity”3.  android:label=”@string/app_name”4.  android:screenOrientation=”portrait”>5.  <intent-filter>6.  <action android:name=”android.intent.action.MAIN”/>

7.  <category android:name=”android.intent.category.LAUNCHER”/>

8.  </intent-filter>

9.  </activity>

Activity’nin Layout Düzenlemesi

activity_main.xml’e aşağıdaki bilgilerin yer alması için beş tane TextView ekleyin:

  • Şehir ve ülke
  • Mevcut sıcaklık
  • Mevcut hava sıcaklığını gösteren bir simge
  • Hava durumu bilgilerinin en son ne zaman güncellendiğini gösteren bir zaman
  • Hava durumu ile ilgili nem ve tanım gibi daha fazla detay bilgi

Bu TextView’leri düzenlemek için RelativeLayout kullanın. activity_main.xml’i aşağıdaki gibi düzenleyelim.

sdrfghjkl

1.  <RelativeLayout2.   xmlns:android=”http://schemas.android.com/apk/res/android“3.  xmlns:tools=”http://schemas.android.com/tools“4.  android:layout_width=”match_parent”5.  android:layout_height=”match_parent”6.  android:id=”@+id/container”

7.  android:paddingBottom=”@dimen/activity_vertical_margin”

8.  android:paddingLeft=”@dimen/activity_horizontal_margin”

9.  android:paddingRight=”@dimen/activity_horizontal_margin”

10.android:paddingTop=”@dimen/activity_vertical_margin”

11.tools:context=”.MainActivity”

12.tools:ignore=”MergeRootFrame”

13.android:background=”#FF0099CC”>

14.<TextView

15.android:id=”@+id/city_field”

16.android:layout_width=”wrap_content”

17.android:layout_height=”wrap_content”

18.android:layout_alignParentTop=”true”

19.android:layout_centerHorizontal=”true”

20.android:textAppearance=”?android:attr/textAppearanceLarge”/>

21.<TextView

22.android:id=”@+id/updated_field”

23.android:layout_width=”wrap_content”

24.android:layout_height=”wrap_content”

25.android:layout_below=”@+id/city_field”

26.android:layout_centerHorizontal=”true”

27.android:textAppearance=”?android:attr/textAppearanceMedium”

28.   android:textSize=”13sp”/>

 

29.   <TextView

30.android:id=”@+id/weather_icon”

31.android:layout_width=”wrap_content”

32.android:layout_height=”wrap_content”

33.android:layout_centerVertical=”true”

34.android:layout_centerHorizontal=”true”

35.android:textAppearance=”?android:attr/textAppearanceLarge”

36.   android:textSize=”70sp”/>

37.<TextView

38.android:id=”@+id/current_temperature_field”

39.android:layout_width=”wrap_content”

40.android:layout_height=”wrap_content”

41.android:layout_alignParentBottom=”true”

42.android:layout_centerHorizontal=”true”

43.android:textAppearance=”?android:attr/textAppearanceLarge”

44.   android:textSize=”40sp”/>

 

45.   <TextView

46.   android:id=”@+id/details_field”

47.android:layout_width=”wrap_content”

48.android:layout_height=”wrap_content”

49.android:layout_below=”@+id/weather_icon”

50.android:layout_centerHorizontal=”true”

51.   android:textAppearance=”?android:attr/textAppearanceMedium”/>

 

52.  </RelativeLayout>

strings.xml Düzenlemesi

Bu dosya uygulamanızda kullanacağınız stringleri içerir. Aynı zamanda hava durumu simgelerini işlemek için kullanacağınız Unicode karakter kodlarını tutar. Bu uygulama sekiz farklı hava durumunu tipini gösterebilecek. Kodlamayı yapmadan önce önceden üye olduğumuz sitede ki APPID’nizi hatırlayın. res > values > strings.xml’i açın ve aşağıdaki gibi düzenleyelim.

NOT: Siteye önceden kayıt olup giriş yaptığınızda yan tarafta uygulama bilgileri çekmek için gerekli olan APP Id anahtarınız çıkıyor.

cvbnmöç

 

1.  <?xml version=”1.0″ encoding=”utf-8″?>2.  <resources>3.  <string name=”app_name”>Hava Durumu</string>4.  <string name=”change_city”>Şehir Seç</string>5.  <!– Buraya kendi APPID’nizi koyun. –>6.  <string name=”open_weather_maps_app_id”>111111</string>

7.  <string name=”weather_sunny”>&#xf00d;</string>

8.  <string name=”weather_clear_night”>&#xf02e;</string>

9.  <string name=”weather_foggy”>&#xf014;</string>

10.<string name=”weather_cloudy”>&#xf013;</string>

11.<string name=”weather_rainy”>&#xf019;</string>

12.<string name=”weather_snowy”>&#xf01b;</string>

13.<string name=”weather_thunder”>&#xf01e;</string>

14.<string name=”weather_drizzle”>&#xf01c;</string>

15.<string name=”place_not_found”>Üzgünüz, hava durumu bilgisi bulunamadı.</string>

16.   </resources>

Menü Öğesi Ekleme

Kullanıcının hava durumunu görmek istediği şehri seçebilmesi gerekir. Bu nedenle menu > menu_main.xml’e gidin ve aşağıdaki gibi düzenleyerek bir menü öğesi ekleyin: 

1.  <menu xmlns:android=”http://schemas.android.com/apk/res/android“2.  xmlns:app=”http://schemas.android.com/apk/res-auto“3.  xmlns:tools=”http://schemas.android.com/tools“4.      tools:context=”.MainActivity”>5.      <item

6.  android:id=”@+id/change_city”

7.  android:orderInCategory=”1″

8.  android:title=”@string/change_city”

9.      app:showAsAction=”never”/>

<menu>

Şimdi tüm XML dosyları kullanılmaya hazır. Devam edelim ve OpenWeatherMap API’den hava durumu verilerini sorgulayalım.

OpenWeatherMap’den Veri Çekme

Not: OpenWeatherMap= http://openweathermap.org/ hava durumu uygulamalarını çektiğimiz ve üye olduğumuz bir site adresidir.

OpenWeatherMap API kullanarak JSON olarak biçimlendirilmiş herhangi bir şehrin güncel hava durumu detaylarını alabilirsiniz.

Örneğin, Canberra şehrinin güncel hava durumu bilgilerini almak içinhttp://api.openweathermap.org/data/2.5/weather?q=Canberra&units=metric adresine bir istek gönderiyoruz.

API’den şuna benzer bir yanıt alırız:

{“base”: “cmc stations”,”clouds”: {“all”: 90},”cod”: 200,”coord”: {“lat”: -35.28,”lon”: 149.13},”dt”: 1404390600,”id”: 2172517, “main”: {“humidity”: 100,”pressure”: 1023,”temp”: -1″temp_max”: -1,”temp_min”: -},”name”: “Canberra”,”sys”: {“country”: “AU”,”message”: 0.313,”sunrise”: 1404335563,”sunset”: 1404370965},”weather”: [{“description”: “overcast clouds”,”icon”: “04n”,”id”: 804,”main”: “Clouds”}],”wind”: {“deg”: 305.004,”speed”: 1.07}
{“base”: “cmc stations”,”clouds”: {“all”: 90},”cod”: 200,”coord”: {“lat”: -35.28,”lon”: 149.13},”dt”: 1404390600,”id”: 2172517, “main”: {“humidity”: 100,”pressure”: 1023,”temp”: -1″temp_max”: -1,”temp_min”: -},”name”: “Canberra”,”sys”: {“country”: “AU”,”message”: 0.313,”sunrise”: 1404335563,”sunset”: 1404370965},”weather”: [{“description”: “overcast clouds”,”icon”: “04n”,”id”: 804,”main”: “Clouds”}],”wind”: {“deg”: 305.004,”speed”: 1.07}

Yeni bir Java sınıfı oluşturun ve adını RemoteFetch.java koyun. Bu sınıf OpenWeatherMap API’den hava durumu verilerini çekmekten sorumlu sınıf olacak. Sınıf oluşturmak için java > paketinizinadı sağ tıklayın New > Java Class’ı seçin.

Uzak istek gönderme işlemini yapmak için HttpURLConnection sınıfını kullanacağız. OpenWeatherMap API, API Key’i x-api-key adında bir HTTP başlığı içinde bekliyor.setRequestProperty metodunu kullanarak isteğimizi belirtiyoruz.

StringBuffer içinde yanıtları okumak için BufferedReader kullanacağız. Yanıtların tamamnını aldığımızdaJSONObject nesnesine dönüştüreceğiz.

Gördüğünüz gibi yukarıdaki yanıtta JSON, cod adında bir alan adı içermektedir. Eğer istek başarılı olduysa bu ad200 değerini alır. Bu değeri JSON yanıtının güncel hava durumu bilgilerine sahip olup olmadığını kontrol etmek için kullanacağız.

RemoteFetch.java sınıfını aşağıdaki gibi düzenleyin:

java class

1.  package com.erbaysoft.havadurumu;2.  import java.io.BufferedReader;3.  import java.io.InputStreamReader;4.  import java.net.HttpURLConnection;5.  import java.net.URL;6.  import org.json.JSONObject;

7.  import android.content.Context;

8.  import android.util.Log;

9.  public class RemoteFetch {

10.private static final String OPEN_WEATHER_MAP_API =

11.”http://api.openweathermap.org/data/2.5/weather?q=%s&units=metric“;

12.public static JSONObject getJSON(Context context, String city){

13.try {

14.URL url = new URL(String.format(OPEN_WEATHER_MAP_API, city));

15.HttpURLConnection connection =

16.(HttpURLConnection)url.openConnection();

17.connection.addRequestProperty(“x-api-key”,

18.context.getString(R.string.open_weather_maps_app_id));

19.BufferedReader reader = new BufferedReader(

20.new InputStreamReader(connection.getInputStream()));

 

21.   StringBuffer json = new StringBuffer(1024);

22.String tmp=””;

23.while((tmp=reader.readLine())!=null)

24.json.append(tmp).append(“\n”);

25.reader.close();

26.JSONObject data = new JSONObject(json.toString());

27.if(data.getInt(“cod”) != 200){

28.return null;

29.}

30.return data;

31.}catch(Exception e){

32.return null;

33.}

34.}

35.   }

Şehir Tercih Etme

Kullanıcı uygulamayı kullanırken her seferinde istediği şehrin ismini yazmak zorunda olmamalıdır. Uygulama kullanıcının ilgilendiği son şehri hatırlamalıdır. Bunu SharedPreferences kullanarak sağlayacağız. Bu tercihlere doğrudan Activity sınıfı ile de ulaşabiliriz ancak bu iş için ayrı bir sınıf oluşturmak daha iyi olacaktır.

Yeni bir sınıf oluşturun ve adını CityPreference.java koyun. Şehir isimlerini depolamak ve geri almak için setCity vegetCity adlarında iki metod oluşturacağız. SharedPreferences objesi constructorda başlatılır. CityPreference.java sınıfı aşağıdaki gibi olmalıdır:

edfgh

1.  package com.erbaysoft.havadurumu;2.  import android.app.Activity;3.  import android.content.SharedPreferences;4.  public class CityPreference {5.  SharedPreferences prefs;6.  public CityPreference(Activity activity){

7.  prefs = activity.getPreferences(Activity.MODE_PRIVATE);

8.  }

9.  // Eğer kullanıcı henüz şehir seçmediyse

10.// İstanbul varsayılan şehir olsun.

11.String getCity(){

12.return prefs.getString(“city”, “Istanbul, TR”);

13.}

14.void setCity(String city){

15.prefs.edit().putString(“city”, city).commit();

16.}

17.}

Fragment Oluşturma

Yeni bir java sınıfı oluşturun ve WeatherFragment.java adını verin. Bu sınıf activit_main.xml’i layout’u olarak kullanacak. Buradaki beş TextView objesini bildireceğiz ve onCreateView metodu içerisinde kullanacağız.weatherFont adında bir Typeface nesnesi belirteceğiz. Bu Typeface nesnesi daha önceden indirip assets/fonts içine yerleştirdiğimiz web font’una işaret edecek.

Zaman uyumlu olmayan verileri almak için ayrı bir Thread kullanacağız. Böyle bir arkaplan threadi ile kullanıcı arayüzünü güncelleyemeyiz. Bu nedenle WeatherFragment sınıfının constructor metodunda yer alan bir Handlernesnesine ihtiyacımız var. 

fragmenr

1.  package com.erbaysoft.havadurumu;2.  import android.app.Fragment;3.  import android.graphics.Typeface;4.  import android.os.Bundle;5.  import android.os.Handler;6.  import android.view.LayoutInflater;

7.  import android.view.View;

8.  import android.view.ViewGroup;

9.  import android.widget.TextView;

10.public class WeatherFragment extends Fragment{

11.Typeface weatherFont;

12.TextView cityField;

13.TextView updatedField;

14.TextView detailsField;

15.TextView currentTemperatureField;

16.TextView weatherIcon;

17.Handler handler;

 

18.public WeatherFragment(){

 

19.   handler = new Handler();

}

20. @Override

21.public View onCreateView(LayoutInflater inflater, ViewGroup container,

22.Bundle savedInstanceState) {

23.View rootView = inflater.inflate(R.layout.activity_main, container, false);

24.cityField = (TextView)rootView.findViewById(R.id.city_field);

25.updatedField = (TextView)rootView.findViewById(R.id.updated_field);

26.detailsField = (TextView)rootView.findViewById(R.id.details_field);

27.currentTemperatureField =

28. (TextView)rootView.findViewById(R.id.current_temperature_field);

29.   weatherIcon = (TextView)rootView.findViewById(R.id.weather_icon);

 

30.   weatherIcon.setTypeface(weatherFont);

31. return rootView;

32.}

33.   }

Typeface üzerinde createFromAsset çağırarak weatherFont nesnesini başlatıyoruz. Ayrıca updateWeatherData metodunu çağırıyoruz.

1.  public void onCreate(Bundle savedInstanceState) {2.  super.onCreate(savedInstanceState);3.  weatherFont = Typeface.createFromAsset(getActivity().getAssets(),4.      “fonts/weather.ttf”);5.  updateWeatherData(new CityPreference(getActivity()).getCity());6.      }

updateWeatherData içerisinde yeni bir thread başlatıyoruz ve RemoteFetch üzerinde getJSON çağırıyoruz. EğergetJSON’dan null değeri gelirse kullanıcıya hata mesajı göstermesini sağlıyoruz. Eğer hata yoksa renderWeathermetodunu çağırıyoruz.

Uygulamanın kullanıcı arayüzünde yalnızca main Threadın yenilenmesine izin veriliyor. Toast veya renderWeatherçağrısının direk olarak background thread’dan yapılması runtime hatası oluşmasına neden olur. Bu metodları çağırırken handler’in post metodunu kullanmamızın nedeni budur. 

1.  private void updateWeatherData(final String city){2.  new Thread(){3.  public void run(){4.      final JSONObject json = RemoteFetch.getJSON(getActivity(), city);5.  if(json == null){6.  handler.post(new Runnable(){

7.  public void run(){

8.  Toast.makeText(getActivity(),

9.  getActivity().getString(R.string.place_not_found),

10.Toast.LENGTH_LONG).show();

11.});

12.} else {

13.handler.post(new Runnable(){

14.public void run(){

15.renderWeather(json);

16.}

17. });

18.   }

19.    }

20.}.start();

21.    }

RenderWeather metodu TextView objelerini yenilemek için JSON verilerin kullanacak. JSON yanıtı bir veri dizisidir. Bu eğitimde bu dizinin yalnızca ilk elementini kullanacağız.

1.  private void renderWeather(JSONObject json){2.  try {3.  cityField.setText(json.getString(“name”).toUpperCase(Locale.US) +4.    “, ” +5.  json.getJSONObject(“sys”).getString(“country”));6.  JSONObject details = json.getJSONArray(“weather”).getJSONObject(0);

7.  JSONObject main = json.getJSONObject(“main”);

8.  detailsField.setText(

9.  “\n” + “Nem Oranı: ” + main.getString(“humidity”) + “%” +

10.”\n” + “Basınç: ” + main.getString(“pressure”) + ” hPa”);

11.currentTemperatureField.setText(

12.   String.format(“%.2f”, main.getDouble(“temp”))+ ” ℃”);

 

13.DateFormat df = DateFormat.getDateTimeInstance();

 

14.String updatedOn = df.format(new Date(json.getLong(“dt”)*1000));

 

15. updatedField.setText(“Son Güncelleme: ” + updatedOn);

 

16.setWeatherIcon(details.getInt(“id”),

 

17.json.getJSONObject(“sys”).getLong(“sunrise”) * 1000,

 

18.json.getJSONObject(“sys”).getLong(“sunset”) * 1000);

 

19.}catch(Exception e){

 

20.Log.e(“HavaDurumu”, “JSON verisinde bir veya daha fazla alan

 

21.bulunamadı”);

 

22.}

 

23.   }

renderWeather metodunun sonunda setWeatherIcon’u çağırıyoruz. hava durumu ikonlarının ayarlanması biraz zor gelebilir. Çünkü OpenWeatherMap API, bizim kullandığımız web fonta oranla daha fazla hava durumunu destekliyor.Daha fazla bilgi için buraya bakabilirsiniz.

Bir id ile bir icon arasındaki planlamayı şu şekilde yapacağız:

  • 200 ile başlayan id’ler sağanak yağışla ilgilidir. Biz bunlar içinstring.weather_thunder kullanacağız.
  • 300 ile başlayanlar çiseleyen yağmurla ilgilidir. Biz bunlar içinstring.weather_drizzle kullanacağız.
  • Bu şekilde devam ediyor…

Güneşi veya ayı göstermek için sunrise (gün doğumu) ve sunset (gün batımı) zamanlarını kullanacağız. 

private void setWeatherIcon(int actualId, long sunrise, long sunset){int id = actualId / 100;String icon = “”;if(actualId == 800){long currentTime = new Date().getTime();if(currentTime>=sunrise && currentTime<sunset) {

icon = getActivity().getString(R.string.weather_sunny);

} else {

icon = getActivity().getString(R.string.weather_clear_night);

}

} else {

switch(id) {

case 2 : icon = getActivity().getString(R.string.weather_thunder);

break;

case 3 : icon = getActivity().getString(R.string.weather_drizzle);

break;

case 7 : icon = getActivity().getString(R.string.weather_foggy);

break;

case 8 : icon = getActivity().getString(R.string.weather_cloudy);

break;

case 6 : icon = getActivity().getString(R.string.weather_snowy);

break;

case 5 : icon = getActivity().getString(R.string.weather_rainy);

break;

}

}

weatherIcon.setText(icon);}

NOT: önceden indirip eklediğimiz ikonları çekiyoruz.

Tabi ki, daha fazla case ifadesi ekleyerek daha fazla hava durumu olmasını sağlayabilirsiniz.

Son olarak, kullanıcının bulunduğu şehri seçmesine izin vermek için changeCity metodunu ekliyoruz.

123 public void changeCity(String city){updateWeatherData(city);}

MainActivity’nin Düzenlenmesi

Projenin kurulumu sırasında, Android Studio MainActivity.java’ya bazı kodları otomatik olarak ekledi. onCreateiçerisindeki kodları WeatherFragment kullanarak aşağıdaki gibi değiştiriyoruz:

123456

7

8

9

10

protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_weather);if (savedInstanceState == null) {getSupportFragmentManager().beginTransaction()

.add(R.id.container, new WeatherFragment())

.commit();

}

}

Daha sonra, onOptionsItemSelected metodunu düzenliyoruz ve menu seçeneğini ekliyoruz.

Kullanıcının şehir ismini girebilmesi için showInputDialog metodu içerisinde AlertDialog.Builder kullanarak birDialog yaratıyoruz.

123456

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

public boolean onOptionsItemSelected(MenuItem item) {if(item.getItemId() == R.id.change_city){showInputDialog();}return false;}

 

private void showInputDialog(){

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

builder.setTitle(“Şehir değiştir”);

final EditText input = new EditText(this);

input.setInputType(InputType.TYPE_CLASS_TEXT);

builder.setView(input);

builder.setPositiveButton(“Tamam”, new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

changeCity(input.getText().toString());

}

});

builder.show();

}

 

public void changeCity(String city){

WeatherFragment wf = (WeatherFragment)getSupportFragmentManager()

.findFragmentById(R.id.container);

wf.changeCity(city);

new CityPreference(this).setCity(city);

PROJEMİZE WİDGET EKLEMEK

Widget, Android uygulamanızı açmadan telefonun ekranında çalışan küçük programcılardır. Örneğin bir hava durumu uygulaması için illaki uygulamayı başlatmamıza ihtiyaç yoktur. Hava Durumu widgeti android telefonumuzun ana ekranına eklenmiş durumdaysa, doğrudan hava bilgilerini görebiliriz. Bugünkü konumuzda da widgetların uygulamamıza nasıl oluşturulduğunu göstereceğiz.

Hazılanmış herhangi bir android uygulamasına da widget eklenebilir. Widget oluşturabilmek için sıfırdan proje oluşturmaya ihtiyaç yoktur. Mevcut projenize ekleme yapabilirsiniz.

Projemize öncelikle yeni bir class ekliyoruz. Yalnız burada dikkat etmemiz gerek yer ClassımızınAppWidgetProvider Classından türemesidir.

 

Eklediğimiz Classa onUpdate metodunu override etmek üzere ekliyoruz. Eklediğimiz Classta kod bloğunda public class widget extends AppWidgetProvider kısmına Sağ tıkladıktan sonra

Source>Override&implement Metods Seçeneğinden, AppWidgetProvider altından OnUpdatemetodunu bulup işaretledikten sonra OK butonuna basarak projemize eklenmesini sağlıyoruz.

ornekresim.jpg3

OnUpdate Metodu, yazacağımız widgetin güncelleme süresi geldiğinde  kullanacağı metoddur.

Yani belli aralıklar ile widgetimizi güncelleyebiliriz.

Adsiiz

Uygulamamız için widget sınıfı tamam, peki ya widget nerede ?

Uygulama kurulurken, android işletim sisteminin  kurulan uygulamada bir widgetin bulunduğunu bilmesi gerekmektedir. projemize bir Android XML File ekleyelim ve resouce type seçeneğini AppWidgetProvider yapalım. xml dosyasının ismi widget olsun, aşağıdaki kodu bu widget’a ekleyelim.

123456

7

8

9

<appwidget-provider xmlns:android=”http://schemas.android.com/apk/res/android“android:initialLayout=”@layout/main”android:updatePeriodMillis=”10000″ 

android:minHeight=”40dip”

 

android:minWidth=”120dip”/>

Bu eklediğimiz kodlar Widget’in tasarımını barındırmaz. Sadece widget ın özelliklerini barındırır. Ne kadar sürede bir güncelleneceği, yükseklik ve genişlik değerlerinin ne olduğu gibi özellikler bu xml üzerindedir. Hangi tasarım layout dosyasının bu widgeta ait olduğu da bu xml dosyası üzerindedir. bkz: android:initialLayout=”@layout/main”

Yani layout üzerinde main.xml isimli bir tasarımım bulunmalı ve bu tasarım widget tasarımı olarak kullanılmalıdır. Tabi ki isim seçmekte özgürsünüz. main.xml dosyası üzerinde sadece bir textfield ekleyelim.

widget’ı programlamaya geçmeden önce yapılması gereken son işlem iste bu widget’in AndroidManifest üzerinde tanıtılmasıdır. AndroidManifest.xml dosyasında <Application> tagları arasına  aşağıdaki kodları yerleştirelim.

123456

7

8

9

<receiverandroid:name=”com.example.wgt.widget” // packageadı.widget class adı.android:label=”@string/app_name” ><intent-filter><action android:name=”android.appwidget.action.APPWIDGET_UPDATE” /></intent-filter>

 

<meta-data   android:name=”android.appwidget.provider”

android:resource=”@xml/widget” />

 

</receiver>

Artık, Widgetımızı programlamaya başlayabiliriz. Widget classının onUpdate metoduna yazacağımız kodlar widget güncellendikçe çalışacaktır.  Kodlamamızda bir timer nesnesi üretip bu nesneden aldığımız zamanı TextView nesnesine yazdıracağız.

123456

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {Timer timer = new Timer();

timer.scheduleAtFixedRate(

new MyTime(context, appWidgetManager), 1,    1000);

 

}

 

private class MyTime extends TimerTask

{

RemoteViews remoteViews;

 

// Layout üzerindeki bileşenlere erişmek için RemoteViews tanımlanır.

 

AppWidgetManager appWidgetManager;

 

// Widget’ı yönetmek için appWidgetManager tanımlanır.

 

ComponentName thisWidget;

 

// Bileşenleri kontrol etmek için ComponentName tanımlanır.

 

DateFormat format = SimpleDateFormat.getTimeInstance(

 

SimpleDateFormat.MEDIUM,

 

Locale.getDefault());

 

public MyTime(Context context, AppWidgetManager appWidgetManager)

 

{

 

this.appWidgetManager = appWidgetManager;

 

remoteViews = new

 

RemoteViews(context.getPackageName(),

 

R.layout.main);

 

thisWidget = new ComponentName(context, widget.class);

 

}

 

@Override

 

public void run()

{

remoteViews.setTextViewText(R.id.widget,

 

“TIME = ” + format.format(new Date()));

 

// main.xml’deki textView’ı günceller

 

appWidgetManager.updateAppWidget(thisWidget, remoteViews);

 

// Yapılan istekleri aktarır */

 

}

 

}

Uygulamayı çalıştırdığımızda, widget otomatik olarak eklenmeyecektir. Uygulama kurulduktan sonra, widget listesine az önce hazırladığımız widget eklenecek ve o listeden telefonumuza ekleyeceğiz.

11033115_888217217865647_1174774719_o

 

Kezban ŞAHİN – Ebru TEKER

 

Kaynaklar

 

 

Yazar Hakkında

Yazar : Kadriye Kundakci

Yazar Hakkında :

Yazarın Tüm Yazıları İçin Tıklayınız

Yorumlar

Sitemizde En Çok Okunan İçerikler

ANDROİD TELEFONLARA ROOT ATMA
ANDROİD TELEFONLARA ROOT ATMARoot Ne demek ? Bir android cihazı root etmek telefonun
fragment
ANDROİD FRAGMENT YAPISI VE KULLANIMIFragmentler Activity içerisinde yer alan kullanıcı ara yüzleridir. Fragment
ANDROİD TELEFONLARDA KONFERANS GÖRÜŞME
ANDROİD TELEFONLARDA KONFERANS GÖRÜŞMEANDROİD TELEFONLARDA KONFERANS GÖRÜŞME   Konferans görüşme çok fazla bilinmeyen androidin
Asp.NET’de web servis hazırlama ve Android de kullanimi  Web Servis Nedir ? Web üzerinden HTTP protokolü ile hizmet

Sitemizde En Çok Yorumlanan İçerikler

Rating Bar Kullanımı
Rating Bar KullanımıAndroid’de yıldız şeklinde derecelendirme çubuğu olarak kullanılır. Kullanıcı sürükleme
Android Wear Emülatör Kurulumu
Android Wear Emülatör Kurulumu   Android studio da geliştireceğimiz uygulamaların kontrolunü yapmak için emülatör
Resim Galerisi Oluşturma
Resim Galerisi OluşturmaAndroid Programlama – Resim Galerisi Oluşturma Bu yazıda, bir galeri
SQLite Database Browser Kullanımı
SQLite Database Browser KullanımıSQLite Database Browser Kullanımı Merhaba arkadaşlar, Android uygulamaları geliştirirken uygulama üzerindeki

Son Yapılan Yorumlar

  • Kategoriler

  • Son Yazılar

  • Takvim

    Kasım 2017
    P S Ç P C C P
    « Kas    
     12345
    6789101112
    13141516171819
    20212223242526
    27282930  
  • Etiketler

  • Son Yorumlar

    • Arşivler

    • Meta