Yorum bırakın

EditText’e max karakter sınırlaması – Android

Bildiğiniz gibi EditText’e koyabileceğimiz bir karakter kısıtlaması bulunmamakta. Yani en azından ben öyle biliyorum =). Ama çoğumuza lazım olan bir şeydir diye tahmin etmekteyim. Bunun da şöyle basit bir yolu varmış. InputFilter kullanarak sorun çözülmüş.

InputFilter’ı kullanmak için de import etmek gerekli bazı şeyleri..:

android.text.InputFilter;

int maxLength = 50; 
InputFilter[] FilterArray = new InputFilter[1]; 
FilterArray[0] = new InputFilter.LengthFilter(maxLength); 
editText.setFilters(FilterArray);

Burada tabii ki editText’imiz bizim daha önceden layoutumuza koyduğum biz EditText..

Kolay gelsin..

Yorum bırakın

EditText’in e-mail içerip içermediği kontrolü – Android

Eğer Androidde bir EditText’in e-mail içerip içermediği kontrol etmek istiyorsanız bu kod size yardımcı olacaktır.

public static boolean isValid(String email) {

 String expression = "^[\\w\\.-]+@([\\w\\-]+\\.)+[A-Z]{2,4}$";
 CharSequence inputStr = email;
 Pattern pattern = Pattern.compile(expression, Pattern.CASE_INSENSITIVE);
 Matcher matcher = pattern.matcher(inputStr);
 if (matcher.matches()) {
 return true;
 }
 else{
 return false;
 }
}

Kolay gelsin..

Yorum bırakın

Android Emulator Orientation Değiştirme

Android Emulator’ünüzün dikeyken yatay, yatayken dikey olmasını istiyorsanız klavyenizdeki tuşları kullanmanız yeterli. Yapılacak işlem çok basit :

CTRL – F11 veya CTRL – F12 yapmanız yeterli..

Kolay gelsin..

Yorum bırakın

Java Web Service kullanımı — Axis2 entegresi ile

Burada Axis 2’yi kullanarak web servis oluşturup buna bağlanarak gerekli bilgiyi alacağız. Bu dökümanda Axis2 entegrasyonunu ve basit bir web service oluşturmayı öğreneceğiz.

Gerekenler:

  1. Eclipse IDE
  2. Axis 2
  3. Tomcat

Axis 2, web servisler için oluşturulmuş çekirdek makinadır(core engine). Bize SOAP kullanılarak dizayn ve yazma sağlayan apache tarafından geliştirilmiş proje diyebiliriz. Java ve C programlama dillerini desteklemektedir. Ayrıca REST ve Spring Framework desteği de mevcuttur.

Axis 2 binary’sini bu linkten indirebilirsiniz :

http://axis.apache.org/axis2/java/core/download.cgi#a1_4

Kurulum :

  1. Binary dosyasını istediğiniz herhangi bir dizine açtıktan sonra Eclipse IDE’sini açıyoruz. Menüden sırasıyla Window -> Preferences seçeneğini tıklıyoruz. Açılan menüden Web Services’dan Axis2 Prefences seçeneğini seçiyoruz. Karşımıza aşağıdaki resimdeki gibi bir ekran gelecektir. Axis2’nin kurulu olduğu dizini seçiyoruz. Böylelikle Eclipse’e axis2’yi tanıtmış oluyoruz.
  2. İkinci adımımız dinamik bir web projesi oluşturmaktır. File > New > Project seçeneğinden web bölmesinin altında Dynamic Web Project seçiyoruz. Proje için bir isim veriyoruz. Biz örneğimizde WebService adını kullanıyoruz.

    Burada eğer Tomcat kurulu değilse New seçeneğini tıklayıp indirme seçeneğini kullanabilirsiniz. Hemen kurulacaktır.

    Burada dikkat edilmesi gereken nokta Configuration kısmıdır. Tomcat’in seçeneğinin yanında bulunan Modify butonuna tıkladıktan sonra aşağıdaki gibi bir menü açılacaktır. Burada “Axis2 Web Services” seçeneğinin işaretli olmasına dikkat etmemiz gerekiyor.

  3. Artık web servisimize ait sınıflarımızı oluşturmaya başlayabiliriz. com.jakobiyem.webservice.example paket isimli MyService adında bir  sınıf oluşturuyoruz.

    Class’ı oluşturduktan sonra aşağıdaki kodumuzu yapıştırıyoruz.

     public String sum(Integer a, Integer b) {
     a + " + " + b + " = " + (a + b); }
  4. MyService sınıfımıza sağ tıklıyoruz. Web Services -> Create Web Service seçeneğine tıklıyoruz.  Ekrana gelen menüde Web Service runtime seçeniğinin Axis 2 olmasını sağlıyoruz. Bunun için yazının üstüne tıklayarak Axis 2 seçiyoruz.
  5. Start Server butonuna bastıktan sonra web servisimiz yaratılmış ve başlatılmış olacaktır. Web servis’e ulaşmak için
    http://localhost:8080/WebService/services/MyService/sum?a=55&b=76yazdığımız takdirde aşağıdaki gibi bir ekran karşımıza gelecektir.Web servise ulaştırken, a ve b değişkenlerini yazdıktan sonra toplayacağımız sayıları yazıyoruz. Biz örnek olarak a’ya 6, b’ye de 76 değerini verdik. Ayrıca Axis 2’nin oluşturduğu wsdl dosyasına

    http://localhost:8080/WebService/services/MyService?wsdl linkinden ulaşabiliriz.

Yorum bırakın

Android Emulator’e apk kurulumu

Merhabalar, bu yazıda Android Emulator’e apk uzantılı dosyaların kurulumunu göreceğiz. İlk olarak emulatorümüzü başlatalım. Eğer kurulum yolunu değiştirmediyseniz emulatorünüzü başlatmak için şu dizine girmelisiniz..:

C:\Program Files\Android\android-sdk\tools

Buradaki emulator.exe’yi çalıştırıp, çalıştırmak istediğiniz emulator’ün üstüne tıklayıp Start dediğimizde emulator çalışmış olacaktır.

Tabii ki eclipse’de çalışırken şu kısa yolu da kullanabilirsiniz..:

Daha sonra kurmak istediğimiz apk uzantılı dosyayı yine C:\Program Files\Android\android-sdk\tools dizinine kopyalıyoruz.

Eğer Windows 7′de çalışıyorsanız şu adımları da yapmalısınız. Yoksa birazdan adb’ is not recognized as an internal or external command, operable program or batch file. gibi bir hata alabilirdiniz. Evet neyse yapılması gerekenler kısaca şöyle..:

  • adb.zip dosyasını indirmeniz gerekiyor.
  • Bu dosyayı zip’den kurtarıp (herhangi bir yerde) içindekilerin hepsini C:\Program Files\Android\android-sdk\tools dizinine kopyalamanız lazım.

Evet artık kuralım şu apk’yı.. Şimdi bilgisayarımızın başlat düğmesine gelip komut satrını çalıştırmamız lazım. Bunun için de arama kutusuna cmd yazıp enter’a basmamız yeterli. Şimdi C:\Program Files\Android\android-sdk\tools dizinine zıplayacağız. Yani komut satırına şunları yazıyoruz..:

cd C:\Program Files\Android\android-sdk\tools

ve adb install application_name.apk dediğimizde istediğimiz apk kurulmuş oluyor.

Artık açtığınız emulator’de  uygulamayı görebilirsiniz.. Kolay gelsin..

Yorum bırakın

Windows Form Uygulamalarında ‘ BackgroundWorker ‘ Kullanımı

BackgroundWorker’ .NET 2.0 ile gelen güzel bir component. Adindan da anlasilabilecegi BackgroundWorker  arkaplanda çalisarak Ana kanalinizi tikamadan islemler yürütmeye yarayan bir component. Formunuza eklediginiz her BackgroundWorker kendi için farkli kanal olusturur ve her kanal birbirinden bagimsiz olarak çalisir.
Örnegin Formunuzda 5 tane button oldugu düsünün ve bes butonun Click eventinde de 2 dakika sürecek bir islem oldugunu farzedelim. Eger uygulamanizda kanallardan faydalanmiyor iseniz 1. Butona bastiktan sonra 2.ye basabilmecek için 2 dakika beklemeniz gerekir.Sebebi basit uygulamaniz tek kanaldan çalisir ve o kanalda tamamen verilen is için çalisir 2. bir isi yapamaz. Fakat siz 5 farkli kanal olusturursaniz ve her butonu farkli kanaldan çalistirirsaniz iste o zaman 5 butonada istediginiz zaman basabilirsiniz. Dogal olarak performansiniz tek kanalli çalismaya göre daha düsük olacaktir.
BackgroundWorker kullanimina örnek bir uygulama yazalim.
Yeni bir Windows Forms Application baslatalim ve formunuza  2 tane Button,ProgressBar ve BackgroundWorker sürükleyin.
BackgroundWorker’a ait 3 event mevcuttur ve bu 3’eventin kullanimi asagida verilmistir.
private void Form1_Load(object sender, EventArgs e)
        {
            //ProgressBarin max degerini verelim.
            progressBar1.Maximum = 1000;
            //BackgroundWorker’dan ana kanalimiza progress bilgisi döndürebilmek için.
            backgroundWorker1.WorkerReportsProgress = true;
            //Worker’i iptal edebilmek için.
            backgroundWorker1.WorkerSupportsCancellation = true;
        }
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            //Basit bir Döngü içerisinden 1000 e kadar saydiralim ve
            //50 milisaniye bekletelim. Worker’imiz sürekli iptal istegi gelig gelmedigini
            //kontrol ediyor. Eger istek gelirse islem Iptal ediliyor.
            for (int i = 0;i< 1000; i++)
            {
                if (backgroundWorker1.CancellationPending)
                {
                    e.Cancel = true;
                    MessageBox.Show(“Islem Iptal Edildi”);
                    break;
                }
                System.Threading.Thread.Sleep(50);
                //ReportProgress methodu ise ProgressChanged eventine paramatre geçirerek
                //ProgressBar’in value’su için kullanacagimiz veriyi sagliyor.
                backgroundWorker1.ReportProgress(i);
            }
        }
        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            //Kanal içerisinden her deger gönderildiginde ProgressBar’da gösterelim.
            progressBar1.Value = e.ProgressPercentage;
        }
        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show(“Islem Bitti”);
        }
        private void button2_Click(object sender, EventArgs e)
        {
            backgroundWorker1.CancelAsync();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync();
        }
Kolay Gelsin..
Yorum bırakın

WPF Uygulamalarında ‘Pencere Kapama Butonunu’ Kaldırmak

Her windows uygulamasında bulunan pencere kapatma, maximize ve minimize etme butonlarını kaldırmak isteyen geliştiriciler aşağıdaki adımları izleyerek amaçlarına ulaşabilirler.

Yapılacak olan işlemler çok basit. Aşağıda verdiğim kodu hangi window için uygulamak isteniyorsa  o window’un “.cs” dosyasına yapıştırılmalıdır. örnek : pencere.xaml.cs

public class WindowBehavior
{
    private static readonly Type OwnerType = typeof (WindowBehavior);

    #region HideCloseButton (attached property)

    public static readonly DependencyProperty HideCloseButtonProperty =
        DependencyProperty.RegisterAttached(
            "HideCloseButton",
            typeof (bool),
            OwnerType,
            new FrameworkPropertyMetadata(false, new PropertyChangedCallback(HideCloseButtonChangedCallback)));

    [AttachedPropertyBrowsableForType(typeof(Window))]
    public static bool GetHideCloseButton(Window obj) {
        return (bool)obj.GetValue(HideCloseButtonProperty);
    }

    [AttachedPropertyBrowsableForType(typeof(Window))]
    public static void SetHideCloseButton(Window obj, bool value) {
        obj.SetValue(HideCloseButtonProperty, value);
    }

    private static void HideCloseButtonChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var window = d as Window;
        if (window == null) return;

        var hideCloseButton = (bool)e.NewValue;
        if (hideCloseButton && !GetIsHiddenCloseButton(window)) {
            if (!window.IsLoaded) {
                window.Loaded += LoadedDelegate;
            }
            else {
                HideCloseButton(window);
            }
            SetIsHiddenCloseButton(window, true);
        }
        else if (!hideCloseButton && GetIsHiddenCloseButton(window)) {
            if (!window.IsLoaded) {
                window.Loaded -= LoadedDelegate;
            }
            else {
                ShowCloseButton(window);
            }
            SetIsHiddenCloseButton(window, false);
        }
    }

    #region Win32 imports

    private const int GWL_STYLE = -16;
    private const int WS_SYSMENU = 0x80000;
    [DllImport("user32.dll", SetLastError = true)]
    private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
    [DllImport("user32.dll")]
    private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);

    #endregion

    private static readonly RoutedEventHandler LoadedDelegate = (sender, args) => {
        if (sender is Window == false) return;
        var w = (Window)sender;
        HideCloseButton(w);
        w.Loaded -= LoadedDelegate;
    };

    private static void HideCloseButton(Window w) {
        var hwnd = new WindowInteropHelper(w).Handle;
        SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_SYSMENU);
    }

    private static void ShowCloseButton(Window w) {
        var hwnd = new WindowInteropHelper(w).Handle;
        SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) | WS_SYSMENU);
    }

    #endregion

    #region IsHiddenCloseButton (readonly attached property)

    private static readonly DependencyPropertyKey IsHiddenCloseButtonKey =
        DependencyProperty.RegisterAttachedReadOnly(
            "IsHiddenCloseButton",
            typeof (bool),
            OwnerType,
            new FrameworkPropertyMetadata(false));

    public static readonly DependencyProperty IsHiddenCloseButtonProperty =
        IsHiddenCloseButtonKey.DependencyProperty;

    [AttachedPropertyBrowsableForType(typeof(Window))]
    public static bool GetIsHiddenCloseButton(Window obj) {
        return (bool)obj.GetValue(IsHiddenCloseButtonProperty);
    }

    private static void SetIsHiddenCloseButton(Window obj, bool value) {
        obj.SetValue(IsHiddenCloseButtonKey, value);
    }

    #endregion

}

Daha sonra geriye sadece “pencere.xaml” dosyasında bu class’ı kullanmak kaldı.

<Window x:Class="wpfExample.MainWindow"
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 Title="MainWindow"
 xmlns:u="clr-namespace:pencere"
 u:WindowBehavior.HideCloseButton="True"

.....
</Window>

Yapılacaklar bu kadar basit.Uygulama sonucunda pencerenin görünümü şu şekilde :

 

Kaynak : http://stackoverflow.com/questions/743906/how-to-hide-close-button-in-wpf-window

 

9 Yorum

Android – MySql Database Connection

Bu örnekte Mysql database ile Android emulator arasında bir bağlantı kurmaya çalışacağız. Bağlantıyı Php webservice ile kurup data alışverişinde JSON kullanacağız. Benim mysql uygulamam localhost’ da çalışacak eğer remote server ile çalışacaksanız ip adres değerlerini değiştirirsiniz.

Şimdi uygulamamız için bir database oluşturalım.

  1. CREATE TABLE `people` (
  2. `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  3. `name` VARCHAR( 100 ) NOT NULL ,
  4. `sex` BOOL NOT NULL DEFAULT ‘1’,
  5. `birthyear` INT NOT NULL
  6. )

bu database ‘e bağlanıp veri çekecek olan php kodumuz ; Unutmadan database e birkaç veri eklemeniz gerekiyor çalışmasını kontrol edebilmek için.Doğum yılı 1980 den büyük olmalı yazacağımız query gereği. Ayrıca database erişimi için verilen şifre ve username unutulmamalı.

<?php

mysql_connect(“127.0.0.1″,”username”,”password”);

mysql_select_db(“peopledata”);

$q=mysql_query(“SELECT * FROM people WHERE birthyear>'”.$_REQUEST[‘year’].”‘”);

while($e=mysql_fetch_assoc($q))

$output[]=$e;

print(json_encode($output));

mysql_close();

?>

Yukarıdaki kod gayet basit şekilde database e bağlanıp query’ i çalıştırıyor. Sonuçları da json formatında encode edip geri getiriyor. getAllPeopleBornAfter.php dosyası olarak kaydediyoruz.

Şimdi android aşamasında ;  veri alışverişi için HttpPost kullanılıyor.. Gelen cevap string’e çeviliyor.. ve json formatında gelen bilgi parse ediliyor..

package com.web.service;
import java.io.BufferedReader;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.util.ArrayList;
import org.apache.http.HttpEntity;
 import org.apache.http.HttpResponse;
 import org.apache.http.NameValuePair;
 import org.apache.http.client.HttpClient;
 import org.apache.http.client.entity.UrlEncodedFormEntity;
 import org.apache.http.client.methods.HttpPost;
 import org.apache.http.impl.client.DefaultHttpClient;
 import org.apache.http.message.BasicNameValuePair;
 import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
import android.util.Log;
public class webserviceEx implements Runnable {
@Override
 public void run() {
//http post
 try{
 String result = "";
 // the year data to send
 ArrayList<NameValuePair> nameValPairs = new ArrayList<NameValuePair>();
nameValPairs.add(new BasicNameValuePair("year","1980"));
//http post
 HttpClient httpclient = new DefaultHttpClient();
// 10.0.2.2 adresi emulator uzerinden fiziksel makinenin localhost'una baglaniyoru
HttpPost httppost = new HttpPost("http://10.0.2.2/getAllPeopleBornAfter.php");
 httppost.setEntity(new UrlEncodedFormEntity(nameValPairs));
 HttpResponse response = httpclient.execute(httppost);
 HttpEntity entity = response.getEntity();
 InputStream is = entity.getContent();
 Log.d("log_tag", "http post completed!");
//convert response to string
 try{
 BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
 StringBuilder sb = new StringBuilder();
 String line = null;
 while ((line = reader.readLine()) != null) {
 sb.append(line + "\n");
 }
 is.close();
 result=sb.toString();
 Log.d("log_tag", "convert response to string completed!");
 }
 catch(Exception err){
 Log.d("log_tag", "Error converting result "+err.toString());
 }
//parse json data
 try{
 JSONArray jArray = new JSONArray(result);
 for(int i=0;i<jArray.length();i++){
 JSONObject json_data = jArray.getJSONObject(i);
 Log.d("log_tag","id: "+json_data.getInt("id")+
 ", name: "+json_data.getString("name")+
 ", sex: "+json_data.getInt("sex")
+", birthyear: "+json_data.getInt("birthyear")
 );
 }
 Log.d("log_tag", "parse json data completed!");
 }
 catch(JSONException er_json){
 Log.d("log_tag", "Error parsing data "+er_json.toString());
 }
}
 catch(Exception er){
 Log.d("log_tag", "Error in http connection "+er.toString());
 }
 Log.d("log_tag", "ALL completed!");
}
}

Uygulama sonucuna logcat ‘den bakabiliriz ..

Kolay gelsin ..
Yorum bırakın

Connection From Emulator To Localhost

Eğer emulator’den kendi bilgisayarımıza bağlanmak istiyorsak ;

ip adres olarak  ; 10.0.2.2

girilmesi gerekir. 127.0.0.1 bilgisayarımızda localhost ‘ a karşılık gelir ancak emulator kendi sanal router yapısını kullandığı için emulator ‘ a bağlanmış oluruz yani fiziksel makinamıza bağlanamaz. Bazı diğer adresler ;

Network Address Description
10.0.2.1 Router/gateway address
10.0.2.2 Special alias to your host loopback interface (i.e., 127.0.0.1 on your development machine)
10.0.2.3 First DNS server
10.0.2.4 / 10.0.2.5 / 10.0.2.6 Optional second, third and fourth DNS server (if any)
10.0.2.15 The emulated device’s own network/ethernet interface
127.0.0.1 The emulated device’s own loopback interface

Daha detaylı bilgi edinmek için :  Network Address Space

Yorum bırakın

Android SocketException Hatası

Android uygulama geliştirirken karşılaştığım basit hatalardan biri de

E/UDP(357): java.net.SocketException: Permission denied hatasıydı. Çözümü gayet basit tek satır bir kod ekleme ile çözbilirsiniz .. Sorun uygulamaya gerekli internet erişim yetkisinin verilmemesi.

AndroidManifest.xml dosyasına application  taglerinin dışına 

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

 

Kodunu yapıştıryoruz.. Daha kapsamlı bilgi için tıklayınız.. Kolay gelsin..