Hazırladığım bir uygulamada ImageView üzerindeki ikonun beyaz ama arkaplan olarak kullandığım drawable'ın dinamik bir renk olması gerekti. İkonun beyaz olması sorununu imageView'ın setColorFilter methodunu çağırarak beyaz renk verdim, o tamam. Ama drawable olarak bir arkaplanı setBackgroundDrawable çağırarak veriyordum. Araya girip renk değiştirmem lazımdı. Bitmap'ler setColorFilter desteklemiyor ama şükür ki Drawable'lar destekliyor. Drawable'ı elimle okudum :
Drawable drawable = getResources().getDrawable(R.drawable.checkin_category_button_background);
daha sonra da color filter'ı multiply modunda uygulamadım.
drawable.setColorFilter(color, Mode.MULTIPLY);
Böylece istediğim renkte dinamik background drawable'ı elde ettim.
Umarım işinize yarar, sevgiler.
17 Ekim 2014 Cuma
23 Eylül 2014 Salı
Fotoğrafları camera uygulamasından alırken data null geliyor!
Evet arkadaşım en sonunda derdine deva olacak ipucuna ulaştın :) Camera uygulamasını kullanıyorsun ve data veya data.getData() null dönüyor değil mi? :) Bir cihazda dönmese de diğer cihazda saçma sapan bir şekilde null geliyor :)
ve işte araştırıp bulduğum çözüm :
Bitmap bitmapData = (Bitmap)data.getExtras().get("data");
bitmapData null mı diye bak eğer null değilse geleni kullan, eğer null geliyorsa şu ana kadar araştırıp denediğin Uri üzerinde okuma işlemini yap.
Nedense bazı üreticiler Nexus v.b. camera uygulamalarını arka planda yazarken onActivityResult'ı çağırırken gönderilen parametreleri farklı yolluyorlar. Eşşekoğlueşşekler :)
Şu hataya çözüm buldum ya Allah'ım sana bin şükür :)
ve işte araştırıp bulduğum çözüm :
Bitmap bitmapData = (Bitmap)data.getExtras().get("data");
bitmapData null mı diye bak eğer null değilse geleni kullan, eğer null geliyorsa şu ana kadar araştırıp denediğin Uri üzerinde okuma işlemini yap.
Nedense bazı üreticiler Nexus v.b. camera uygulamalarını arka planda yazarken onActivityResult'ı çağırırken gönderilen parametreleri farklı yolluyorlar. Eşşekoğlueşşekler :)
Şu hataya çözüm buldum ya Allah'ım sana bin şükür :)
Harita üzerindeki marker'larımın title kısmının açık olarak gelmesini istiyorum
Haritanız var ve üzerinde marker'lar var. Onlardan 1 tanesinin selected olarak yani title'ını gösterir halde gelmesini istiyorsanız şöyle bi kod yazdım üst kısımdaki lokasyon aktarmalarını es geçin :)
double latitude = DataProxy.getInstance().getMapLatitude();
double longitude = DataProxy.getInstance().getMapLongitude();
String placeName = DataProxy.getInstance().getMapPlaceName();
// initialize google map control
GoogleMap googleMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
// create marker
MarkerOptions markerOptions = new MarkerOptions().position(new LatLng(latitude, longitude));
if (placeName != "")
markerOptions.title(placeName);
// adding marker
Marker marker = googleMap.addMarker(markerOptions);
marker.showInfoWindow();
// focus to desired location
googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(latitude, longitude), 15.0f));
double latitude = DataProxy.getInstance().getMapLatitude();
double longitude = DataProxy.getInstance().getMapLongitude();
String placeName = DataProxy.getInstance().getMapPlaceName();
// initialize google map control
GoogleMap googleMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
// create marker
MarkerOptions markerOptions = new MarkerOptions().position(new LatLng(latitude, longitude));
if (placeName != "")
markerOptions.title(placeName);
// adding marker
Marker marker = googleMap.addMarker(markerOptions);
marker.showInfoWindow();
// focus to desired location
googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(latitude, longitude), 15.0f));
Aynı uygulamanın simgesi uygulamalarda iki tane gözüküyor!
Dedim aman Allah'ım neler oluyor. Uygulama listesinde uygulamam 2 tane gözüküyor. Tabii ben de normal olarak gidip uygulamamı elle kaldırdım. Yeniden eclipse'ten publish edince yine 2 tane oldular. Bu sefer de dedim neler oluyor :) Meğersem sorun şuymuş. Android.manifest dosyanızı açın LAUNCHER yazıp ilk olarak projenizle gelen launcher satırı hariç aşağılarda örnekleri denerken yanlışlıkla eklediğiniz LAUNCHER intent-filter'ını kaldırın. Yanlızca intent-filter'ı kaldırın Activity'si belki size hala lazımdır :) şıkır şıkırımmmm
12 Haziran 2014 Perşembe
Joda ve Proguard felaketi
Uygulamayı hazırladınız herşey güzel ve zaman hesaplamaları için efsanevi derecede harika çalışan (ciddiyim) JodaTime kullandınız. Birden proguard export hataları vermeye başladı. İşte sıçtığınızın resmi :) Korkmayın kormayın ben olayı çözdüm size anlatayım :)) İlk olarak import ettiğiniz lib'ler lib klasörünüzde varmı diye bakın daha sonra joda-time-x.x.jar dosyanız var mı diye ve daha daha sonra da onun yanında joda-convert-x.x.jar dosyanız libs klasörünüzde var mı kontrol edin. Daha sonra projenizin properties bölümünden > Java Build Path > Libraries bölümünde bu jar dosyalarının üstlerde ve check'li olup olmadığını kontrol edin. Eveeet geldik asıl trick'e :) joda-convert-1.5.jar değil de joda-convert-1.4.jar indirin ve onu kurun. Çalışacaaaak kısmetse :) Hepinize comolokko, öptüm
8 Haziran 2014 Pazar
Facebook için yapabileceğiniz birçok şeye deva bulduk
Bu akşam arkadaşım Aybars'la oturup Facebook SDK'i dibine kadar oyduk. 2.0, 3.0 ve 3.1 SDK versiyonlarının arka arkaya Facebook tarafından publish edilmesinden dolayı falafoş olmuş bir çok örnek internette mevcut. Bir örneğin komudu bile yok, diğer örneği methodu deprecate olmuş bir başkası Graph API değiştiğinde dolayı çalışmaz hale gelmiş. O yüzden kendim adım adım test ede ede yeni bir single FacebookManager sınıfı oluşturduk. Kullanım gayet kolay.
1. FacebookManager.getInstance.setContext(this); satırını ana activity'nizin onCreate methodunun sonuna ekleyin.
2. postToWall komudu hariç diğer komutlar login komudunu çağırmanızı gerektirmektedir.
3. parametreleri doldurup aşağıdaki komutları çağırabilirsiniz.
login
logout
getUser
getUserFriendIds
postToWall
postToPhotos
isSessionOpened
Umarız beğenirsiniz, adyos.
http://www.dogancoruh.com/files/TeslaClient.zip
1. FacebookManager.getInstance.setContext(this); satırını ana activity'nizin onCreate methodunun sonuna ekleyin.
2. postToWall komudu hariç diğer komutlar login komudunu çağırmanızı gerektirmektedir.
3. parametreleri doldurup aşağıdaki komutları çağırabilirsiniz.
login
logout
getUser
getUserFriendIds
postToWall
postToPhotos
isSessionOpened
Umarız beğenirsiniz, adyos.
http://www.dogancoruh.com/files/TeslaClient.zip
2 Haziran 2014 Pazartesi
Kendi yazdığım bileşeni layout içinde kullanamıyorum?
Evet kendiniz için özel bir bileşen hazırladınız. Bu bileşen mevcut bir bileşenin ek özelliklere sahip bir versiyonu ya da birden fazla UI bileşenini ihtiva eden bir composite control olabilir. Her neyse. Yazma işlemi bitti keyiflisiniz ve activity'nizin layout'una ekleyip bi denemek istediniz ama garip garip RuntimeException'lar ya da resource hataları alıyorsanız :) küçük bir şeyi unutuyorsunuz. Layout'un root bileşenine (muhtemelen bir LinearLayout) bir attribute eklemeniz gerekiyor.
xmlns:app="http://schemas.android.com/apk/res-auto"
Bu ifadeyi attribute olarak ekleyince Android SDK sizin yazdığınız bileşenin resource'larını da olaya dahil ediyor. Hadi kolay gelsin :)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#e6e1da"
android:tag="contentView"
>
layout içinde örnek bileşen kullanımı
<com.dogancoruh.myproject.controls.CountButton
android:id="@+id/countButtonProfileCheckins"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginRight="5dp"
android:layout_marginBottom="5dp"
app:text="Checkin"
app:count="0"
/>
xmlns:app="http://schemas.android.com/apk/res-auto"
Bu ifadeyi attribute olarak ekleyince Android SDK sizin yazdığınız bileşenin resource'larını da olaya dahil ediyor. Hadi kolay gelsin :)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#e6e1da"
android:tag="contentView"
>
layout içinde örnek bileşen kullanımı
<com.dogancoruh.myproject.controls.CountButton
android:id="@+id/countButtonProfileCheckins"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginRight="5dp"
android:layout_marginBottom="5dp"
app:text="Checkin"
app:count="0"
/>
30 Mayıs 2014 Cuma
Android Push Notification Tutorial
Yav arkadaş bi push notification entegre etmek bu kadar zor olur mu ya. Google'ın dökümanlarını pek sevmedim o yüzden daha iyi bir tutorial arayışına girdim. Meret Android için iOS kadar basit değil. Bulabildiğim en iyi tutorial'ı sizinle paylaşıyorum. Başka tutorial'leri de takip etmeye çalıştım ama bu adım adım uygulamayı gösteriyor.
http://hmkcode.com/android-google-cloud-messaging-tutorial/
Ayrıca bu api'yi kullanmak için C# ile bir örnek WinForms uygulaması hazırladım. Umarım beğenirsiniz. Uygulamayla ilgili herhangi bir sorunuz için lütfen mail atın.
http://www.dogancoruh.com/files/GCMSender.zip
http://hmkcode.com/android-google-cloud-messaging-tutorial/
Ayrıca bu api'yi kullanmak için C# ile bir örnek WinForms uygulaması hazırladım. Umarım beğenirsiniz. Uygulamayla ilgili herhangi bir sorunuz için lütfen mail atın.
http://www.dogancoruh.com/files/GCMSender.zip
14 Mayıs 2014 Çarşamba
Android ve müşterinin cihazında hata düzeltme :)
Uygulamayı hazırladınız ama müşteri uzakta (mesela siz Ankara o İstanbul'da) ve müşteri bi noktadan sonra uygulamanın kapandığını söylüyor. ADB'ye cihazı bağlamanıza imkan yok çünkü müşteri kilometrelerce uzakta, e kargoyla da yollatamazsınız :) Napıcaksınız? Cevap basit: Müşteriye Log Collector kurduracaksınız :) Ben kendi kıçımı kurtarmak için MX Log Collector kullandım ama siz başka bir tanesini de Google Play'den indirtip kullanabilirsiniz. Yapmanız gereken log collector'ı kurdurup ardından uygulamayı bir kez daha göçertmesini sağlatmanız. Sonra da Log Collector yazılımıyla size mail atması.
Gelen veri şöyle birşey oluyor:
05-14 22:26:19.749 496 496 D SignalClusterView: wifi: VISIBLE sig=2130837743 act=2130837721
05-14 22:26:19.749 496 496 D SignalClusterView: mobile1: VISIBLE sig=2130837711 act=0 typ=2130837668
05-14 22:26:19.749 496 496 D SignalClusterView: mobile2: VISIBLE sig=0 act=0 typ=2130837668
05-14 22:26:19.749 496 496 D SignalClusterView: wifi: VISIBLE sig=2130837743 act=2130837721
05-14 22:26:19.749 496 496 D SignalClusterView: mobile1: VISIBLE sig=2130837711 act=0 typ=2130837668
05-14 22:26:19.749 496 496 D SignalClusterView: mobile2: VISIBLE sig=0 act=0 typ=2130837668
05-14 22:26:19.749 496 496 D StatusBar-NetworkControllerDS: changing data overlay icon id to 2130837721
05-14 22:26:19.769 366 436 D KeyguardViewMediator: setHidden false
05-14 22:26:19.789 366 436 D KeyguardViewMediator: setHidden false
05-14 22:26:19.799 366 436 D KeyguardViewMediator: setHidden false
05-14 22:26:19.819 366 436 D KeyguardViewMediator: setHidden false
05-14 22:26:19.839 366 436 D KeyguardViewMediator: setHidden false
05-14 22:26:19.849 366 436 D KeyguardViewMediator: setHidden false
05-14 22:26:19.859 366 383 I power : *** release_dvfs_lock : lockType : 1
05-14 22:26:19.859 366 383 D PowerManagerService: releaseDVFSLockLocked : all DVFS_MIN_LIMIT are released
05-14 22:26:19.869 366 436 D KeyguardViewMediator: setHidden false
05-14 22:26:19.889 366 436 D KeyguardViewMediator: setHidden false
05-14 22:26:19.899 366 436 D KeyguardViewMediator: setHidden false
05-14 22:26:19.989 366 2158 D KeyguardViewMediator: setHidden false
05-14 22:26:20.019 13997 13997 D AndroidRuntime: Shutting down VM
05-14 22:26:20.019 13997 13997 W dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x40c17a68)
05-14 22:26:20.059 13997 13997 E AndroidRuntime: FATAL EXCEPTION: main
05-14 22:26:20.059 13997 13997 E AndroidRuntime: java.lang.UnsupportedOperationException
05-14 22:26:20.059 13997 13997 E AndroidRuntime: at android.view.GLES20Canvas.clipPath(GLES20Canvas.java:424)
05-14 22:26:20.059 13997 13997 E AndroidRuntime: at com.trendin.trendin.controls.RoundedImageView.onDraw(RoundedImageView.java:43)
05-14 22:26:20.059 13997 13997 E AndroidRuntime: at android.view.View.draw(View.java:11097)
05-14 22:26:20.059 13997 13997 E AndroidRuntime: at android.view.View.getDisplayList(View.java:10536)
05-14 22:26:20.059 13997 13997 E AndroidRuntime: at android.view.ViewGroup.drawChild(ViewGroup.java:2864)
05-14 22:26:20.059 13997 13997 E AndroidRuntime: at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2503)
05-14 22:26:20.059 13997 13997 E AndroidRuntime: at android.view.View.getDisplayList(View.java:10534)
05-14 22:26:20.059 13997 13997 E AndroidRuntime: at android.view.ViewGroup.drawChild(ViewGroup.java:2864)
05-14 22:26:20.059 13997 13997 E AndroidRuntime: at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2503)
05-14 22:26:20.059 13997 13997 E AndroidRuntime: at android.view.View.getDisplayList(View.java:10534)
05-14 22:26:20.059 13997 13997 E AndroidRuntime: at android.view.ViewGroup.drawChild(ViewGroup.java:2864)
05-14 22:26:20.059 13997 13997 E AndroidRuntime: at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2503)
05-14 22:26:20.059 13997 13997 E AndroidRuntime: at android.view.View.getDisplayList(View.java:10534)
Bu verideki problemi kırmızıyla işaretledim. Müşterinin makinasında OpenGL grafik hızlandırıcı clipPath komutunu desteklemiyor. Bundan dolayı kendi yazdığım RoundedImageView bileşenimdeki canvas.clipPath işleminden önce setLayerType(LAYER_TYPE_SOFTWARE, null); yaptım. Bu işlemle çizdirme işlemleri Software olarak yapıldığı için tüm sorunlar bir anda yok oluverdi :) Umarım sizin de işinize yarar.
Gelen veri şöyle birşey oluyor:
05-14 22:26:19.749 496 496 D SignalClusterView: wifi: VISIBLE sig=2130837743 act=2130837721
05-14 22:26:19.749 496 496 D SignalClusterView: mobile1: VISIBLE sig=2130837711 act=0 typ=2130837668
05-14 22:26:19.749 496 496 D SignalClusterView: mobile2: VISIBLE sig=0 act=0 typ=2130837668
05-14 22:26:19.749 496 496 D SignalClusterView: wifi: VISIBLE sig=2130837743 act=2130837721
05-14 22:26:19.749 496 496 D SignalClusterView: mobile1: VISIBLE sig=2130837711 act=0 typ=2130837668
05-14 22:26:19.749 496 496 D SignalClusterView: mobile2: VISIBLE sig=0 act=0 typ=2130837668
05-14 22:26:19.749 496 496 D StatusBar-NetworkControllerDS: changing data overlay icon id to 2130837721
05-14 22:26:19.769 366 436 D KeyguardViewMediator: setHidden false
05-14 22:26:19.789 366 436 D KeyguardViewMediator: setHidden false
05-14 22:26:19.799 366 436 D KeyguardViewMediator: setHidden false
05-14 22:26:19.819 366 436 D KeyguardViewMediator: setHidden false
05-14 22:26:19.839 366 436 D KeyguardViewMediator: setHidden false
05-14 22:26:19.849 366 436 D KeyguardViewMediator: setHidden false
05-14 22:26:19.859 366 383 I power : *** release_dvfs_lock : lockType : 1
05-14 22:26:19.859 366 383 D PowerManagerService: releaseDVFSLockLocked : all DVFS_MIN_LIMIT are released
05-14 22:26:19.869 366 436 D KeyguardViewMediator: setHidden false
05-14 22:26:19.889 366 436 D KeyguardViewMediator: setHidden false
05-14 22:26:19.899 366 436 D KeyguardViewMediator: setHidden false
05-14 22:26:19.989 366 2158 D KeyguardViewMediator: setHidden false
05-14 22:26:20.019 13997 13997 D AndroidRuntime: Shutting down VM
05-14 22:26:20.019 13997 13997 W dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x40c17a68)
05-14 22:26:20.059 13997 13997 E AndroidRuntime: FATAL EXCEPTION: main
05-14 22:26:20.059 13997 13997 E AndroidRuntime: java.lang.UnsupportedOperationException
05-14 22:26:20.059 13997 13997 E AndroidRuntime: at android.view.GLES20Canvas.clipPath(GLES20Canvas.java:424)
05-14 22:26:20.059 13997 13997 E AndroidRuntime: at com.trendin.trendin.controls.RoundedImageView.onDraw(RoundedImageView.java:43)
05-14 22:26:20.059 13997 13997 E AndroidRuntime: at android.view.View.draw(View.java:11097)
05-14 22:26:20.059 13997 13997 E AndroidRuntime: at android.view.View.getDisplayList(View.java:10536)
05-14 22:26:20.059 13997 13997 E AndroidRuntime: at android.view.ViewGroup.drawChild(ViewGroup.java:2864)
05-14 22:26:20.059 13997 13997 E AndroidRuntime: at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2503)
05-14 22:26:20.059 13997 13997 E AndroidRuntime: at android.view.View.getDisplayList(View.java:10534)
05-14 22:26:20.059 13997 13997 E AndroidRuntime: at android.view.ViewGroup.drawChild(ViewGroup.java:2864)
05-14 22:26:20.059 13997 13997 E AndroidRuntime: at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2503)
05-14 22:26:20.059 13997 13997 E AndroidRuntime: at android.view.View.getDisplayList(View.java:10534)
05-14 22:26:20.059 13997 13997 E AndroidRuntime: at android.view.ViewGroup.drawChild(ViewGroup.java:2864)
05-14 22:26:20.059 13997 13997 E AndroidRuntime: at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2503)
05-14 22:26:20.059 13997 13997 E AndroidRuntime: at android.view.View.getDisplayList(View.java:10534)
Bu verideki problemi kırmızıyla işaretledim. Müşterinin makinasında OpenGL grafik hızlandırıcı clipPath komutunu desteklemiyor. Bundan dolayı kendi yazdığım RoundedImageView bileşenimdeki canvas.clipPath işleminden önce setLayerType(LAYER_TYPE_SOFTWARE, null); yaptım. Bu işlemle çizdirme işlemleri Software olarak yapıldığı için tüm sorunlar bir anda yok oluverdi :) Umarım sizin de işinize yarar.
11 Mayıs 2014 Pazar
Zoom'lanabilir ImageView
Zoom'lanabilir bir ImageView ararken en sonunda bu koda karar kıldım. Layout'unuz içinde sadece ImageView tag'inizi com.dogancoruh.pinchimageview.PinchImageView ile değiştirin yeter. Örneğin bir namespace'i olmadığı için kendi namespace'imi verdim.
Klavye açık gelmesin
Activity ekrana geldiğinde eğer ilk kontrolünüz bir EditText ise otomatik edittext'e focus olunduğu için klavyenin otomatik açıldığını göreceksiniz. Kapatmak basit, AndroidManifest.xml dosyasında ilgili activity'nin xml nodunu bulun ve attribute olarak android:windowSoftInputMode="stateHidden" ekleyin. Böylece ilk geldiğinde klavye açılmayacak ama EditText içine dokunursanız açılacaktır. :) Bu kadar.
1 Mayıs 2014 Perşembe
R resource dosyamda hata var ve derlemiyor
R dosyanız eğer oluşmuyorsa nedeni belkide uygun olmayan dosya isimleri olabilir. Özellikle iOS development yapıyorsanız ve benim gibi @2x suffix'li resim dosyalarını drawable-hdpi klasörüne kopyalayıp hızlı şekilde F2 ile isimlerini @2x olmaksızın versiyonlarına çevirirken bir tanesini unursanız eclipse garip ve aniden R resource dosyası sorunları vermeye başlıyor. O arada da kahve almaya gitmişseniz olayın neden kaynaklandığını anlamanız zaman alabilir :) Dosya isimlerine dikkat :)
12 Nisan 2014 Cumartesi
Layout_weight çalışmıyor
Örneğin horizontal bir LinearLayout içindesiniz. Sol kısımda bir kullanıcının resmi var. Ortada bir LinearLayout içinde 2 TextView var ve üstte kullanıcının adı altta da kullanıcının istediği bir metin yazıyor. En solda da bir ImageButton var. Ortada bulunan LinearLayout width'i match_parent. Bu layout'u gösterdiğinizde sağ kısımdaki ImageButton'ı göremezsiniz. Ortadaki LinearLayout'a Layout_weight 1 verirseniz yine çalışmayacaktır. Çünkü bu yazının ipucu olan şey eksik. LinearLayout'un layout_width'ini 0dp yapın ve çalışsın :)
Kaydol:
Kayıtlar (Atom)