Eki 01

Android Döviz Kurları Widget Uygulaması

Merhaba arkadaşlar bugün bir kaç bileşeni bir arada kullanarak widget içerisinde döviz kurlarını görüntüleyeceğiz. Bunu nasıl yapacağımıza bakacağız hep birlikte. Öncelikle AsyncTask’lar hakkında önceki yazımı okumanızı tavsiye ederim. Zira api.doviz.com adresinden çekeceğimiz json verisini asynctask içerisinde parse edip kullanacağız. Bunun yanında widget yapmayı da ben de yeni öğrendim. Çeşitli kaynaklardan edindiğim bilgiler ışığında widget yaptım. Daha sonra da bunu asynctask ile bağlayıp döviz kurunu gösterdim. Bunları nasıl yaptığımı anlatacağım.

Widget için şuradaki web kaynağından faydalandım.

drawable klasörüm; (android simgesinden sonra yenile resmi bulunmaktadır. Arka plandan dolayı görünmemektedir.)

appwidget_dark_bg_focused.9 appwidget_dark_bg_pressed.9 appwidget_dark_bg.9 ic_launcher ic_sync_button

res klasörü altında xml klasörü oluşturup içerisine demo_widget_provider.xml dosyasını oluşturun. İçeriği aşağıdaki gibi olmalıdır.

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialLayout="@layout/activity_main"
    android:minHeight="160dp"
    android:minWidth="300dp"
    android:previewImage="@drawable/widget"
    android:updatePeriodMillis="1000000" >
</appwidget-provider>

activity_main.xml’de aşağıdaki gibi olmalıdır.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_margin="5sp"
    android:background="@drawable/appwidget_dark_bg"
    android:orientation="vertical" >

    <RelativeLayout
        android:id="@+id/buttonContainer"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true" >

        <Button
            android:id="@+id/sync_button"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:layout_centerInParent="true"
            android:background="@drawable/ic_sync_button"
            android:text="" />
    </RelativeLayout>

    <LinearLayout
        android:id="@+id/contentContainer"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_above="@id/buttonContainer"
        android:layout_alignParentTop="true"
        android:orientation="vertical"
        android:padding="8dp" >

        <TextView
            android:id="@+id/title"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:maxLines="2"
            android:paddingBottom="5dp"
            android:text=""
            android:textColor="#fcfcfc"
            android:textSize="16sp"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/desc"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text=""
            android:textColor="#fcfcfc"
            android:textSize="15sp"
            android:textStyle="normal" />
    </LinearLayout>

</RelativeLayout>

Mainactivity.java dosyasına bu uygulama sadece widget olacağından dolayı tek satır kod yazdım OnCreate fonksiyonu içerisine


import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        super.onBackPressed();
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }
}

MyWidgetIntentReceiver.java dosyası

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.RemoteViews;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONObject;

public class MyWidgetIntentReceiver extends BroadcastReceiver {
    public static int clickCount = 0;
    private String msg[] = null;
    String dolara,dolars,euroa,euros,gramaltina,gramaltins,bilezik22a,bilezik22s,ceyreka,ceyreks;
    Context ctx;

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(WidgetUtils.WIDGET_UPDATE_ACTION)) {
            new TestAltin().execute();
            ctx=context;
        }
    }

    private void updateWidgetPictureAndButtonListener(Context context) {
        RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
                R.layout.activity_main);
        // view güncelleniyor.
        remoteViews.setTextViewText(R.id.title, getTitle());
        remoteViews.setTextViewText(R.id.desc, "\bDolar Alış : "+dolara+" Satış : "+dolars+"\n\bEuro Alış : "+euroa+" Satış : "+euros+"\n\bAltın Alış : "+gramaltina+
        " Satış : "+gramaltins+"\n\bÇeyrek Altın Alış : "+ceyreka+" Satış : "+ceyreks+"\n\b22 Bilezik Alış : "+bilezik22a+" Satış : "+bilezik22s);

        // click listener kaydediliyor.
        remoteViews.setOnClickPendingIntent(R.id.sync_button,
                MyWidgetProvider.buildButtonPendingIntent(context));

        MyWidgetProvider.pushWidgetUpdate(context.getApplicationContext(),
                remoteViews);
    }

    private String getDesc(Context context) {
        msg = context.getResources().getStringArray(R.array.news_headlines);
        if (clickCount >= msg.length) {
            clickCount = 0;
        }
        return msg[clickCount];
    }

    private String getTitle() {
        return "Piyasalar";
    }
//Altın verilerini almak için gerekli kodlar
    public class TestAltin extends AsyncTask<String, Void, Void> {
        @Override
        protected Void doInBackground(String... params) {
            try {
                HttpClient client = new DefaultHttpClient();
                String getURL = "http://api.doviz.com/list/G";
                HttpGet get = new HttpGet(getURL);
                get.setHeader("content-type", "application/json");
                HttpResponse responseGet = client.execute(get);
                HttpEntity resEntityGet = responseGet.getEntity();
                String jsonResult="{}";
                if (resEntityGet != null) {
                    jsonResult= EntityUtils.toString(resEntityGet);
                }
                JSONObject newJsonObj=new JSONObject(jsonResult);
                JSONArray jsonDizi=newJsonObj.getJSONArray("value");
                for(int i=0; i<jsonDizi.length();i++){
                    JSONObject jsonobj=jsonDizi.getJSONObject(i);
                    if(jsonobj.getString("key2").equals("gram-altin")){
                        gramaltina=jsonobj.getString("alis");
                        gramaltins=jsonobj.getString("satis");
                    }
                    else if (jsonobj.getString("key2").equals("ceyrek-altin")){
                        ceyreka=jsonobj.getString("alis");
                        ceyreks=jsonobj.getString("satis");
                    }
                    else if(jsonobj.getString("key2").equals("22-ayar-bilezik")){
                        bilezik22a=jsonobj.getString("alis");
                        bilezik22s=jsonobj.getString("satis");
                    }

                }

            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;

        }
        @Override
        protected void onPostExecute(Void result) {

            new TestDoviz().execute();
        }
        @Override
        protected void onPreExecute() {

        }

        @Override
        protected void onProgressUpdate(Void... values) {
        }

    }
//Euro Dolar verilerini almak için gerekli kodlar
public class TestDoviz extends AsyncTask<String, Void, Void> {
 @Override
 protected Void doInBackground(String... params) {
 try {
 HttpClient client = new DefaultHttpClient();
 String getURL = "http://api.doviz.com/list/C";
 HttpGet get = new HttpGet(getURL);
 get.setHeader("content-type", "application/json");
 HttpResponse responseGet = client.execute(get);
 HttpEntity resEntityGet = responseGet.getEntity();
 String jsonResult="{}";
 if (resEntityGet != null) {
 jsonResult= EntityUtils.toString(resEntityGet);
 }
 JSONObject newJsonObj=new JSONObject(jsonResult);
 JSONArray jsonDizi=newJsonObj.getJSONArray("value");
 JSONObject dolar=new JSONObject();
 JSONObject euro=new JSONObject();
 dolar=jsonDizi.getJSONObject(0);
 euro=jsonDizi.getJSONObject(1);
 dolara=dolar.getString("alis");
 dolars=dolar.getString("satis");
 euroa=euro.getString("alis");
 euros=euro.getString("satis");

 } catch (Exception e) {
 e.printStackTrace();
 }
 return null;

 }
 @Override
 protected void onPostExecute(Void result) {
 updateWidgetPictureAndButtonListener(ctx);
 }
 @Override
 protected void onPreExecute() {

 }

 @Override
 protected void onProgressUpdate(Void... values) {
 }
 }
}

MyWidgetProvider.java dosyası;

import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;

public class MyWidgetProvider extends AppWidgetProvider {
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
                         int[] appWidgetIds) {

        // widget yukleniyor.
        RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
                R.layout.activity_main);

        // butona event ekle
        remoteViews.setOnClickPendingIntent(R.id.sync_button,
                buildButtonPendingIntent(context));

        // ilk veri güncelleniyor.
        remoteViews.setTextViewText(R.id.title, getTitle());
        remoteViews.setTextViewText(R.id.desc, getDesc());

        // widget guncelleme yanıtı
        pushWidgetUpdate(context, remoteViews);
    }

    public static PendingIntent buildButtonPendingIntent(Context context) {
        ++MyWidgetIntentReceiver.clickCount;

        // widget yanıtını ilklendir.
        Intent intent = new Intent();
        intent.setAction(WidgetUtils.WIDGET_UPDATE_ACTION);
        return PendingIntent.getBroadcast(context, 0, intent,
                PendingIntent.FLAG_UPDATE_CURRENT);
    }

    private static CharSequence getDesc() {
        return "Piyasa bilgilerini al";
    }

    private static CharSequence getTitle() {
        return "Piyasalar";
    }

    public static void pushWidgetUpdate(Context context, RemoteViews remoteViews) {
        ComponentName myWidget = new ComponentName(context,
                MyWidgetProvider.class);
        AppWidgetManager manager = AppWidgetManager.getInstance(context);
        manager.updateAppWidget(myWidget, remoteViews);
    }
}

WidgetUtils.java dosyası;

public class WidgetUtils {
   final static String WIDGET_UPDATE_ACTION ="com.javatechig.intent.action.UPDATE_WIDGET";
}

Uygulamanın ekran görüntüleri resimlerde görüldüğü gibidir. Anlamadığınız veya yapamadığınız bir yer varsa yazıya yorum yaparak bana ulaşabilirsiniz. Yardımcı olmaya çalışırım.
Screenshot_2015-10-01-09-46-39 Screenshot_2015-10-01-09-46-43

Bir Cevap Yazın