Android Not Defteri Uygulaması

Merhabalar arkadaşlar,

Kısa bir süre önce SQLite’ın ne olduğu ve android üzerinde nasıl kullanıldığıyla ilgili kısa bilgiler vermiştim. Vermiş olduğum bilgileri biraz daha anlaşılabilir hale getirmek adına yazmış olduğum “Not Defterim” uygulaması bugünkü yazımın konusu.

Yazının akışında, ilk olarak uygulamanın nasıl çalıştığını görselleriyle anlatacağım daha sonra ise uygulamanın yorum satırlarınıda içeren kaynak kodu paylaşacağım. Sqlite ve customlistview  konusunda içerik barındıran bir uygulama olan “Not Defterim” uygulamasının  uygulamalarınızı geliştirirken yardımcı olması dileğiyle ;).

Uygulamanın Çalışması

Not defteri uygulaması, not ekleyip notlar üzerinde düzenlemeler ve silme işlemi yapabileceğiniz bir uygulama. Eklenen notlar sqlite veritabanında kaydediliyor ve ihtiyaca göre sorgularla çağrılıyor. Ayrıca notları listelerken kullanılan listview yapısının elementleri custom olarak hazırlanmış bir layoutun listeye adapte edilmesiyle oluşuyor.


Uygulamanın nasıl çalıştığını ekran görüntüleri üzerinde anlatmak gerekirse;

1. Not Listesi

Uygulamamızı açtığımızda eklemiş olduğumuz notları görüyoruz. Eğer hiç notumuz olmasaydı uygulamamız bizleri otomatik olarak not ekleme kısmına yönlendirecekti.

2. Operasyonlar

Tüm operasyonları not listesindeki elemanlara  normal ve uzun süreli tıklama işlemleriyle gerçekleştiriyoruz.

2.1 Tek Tık (Click) : Konuyla ilgili notun içeriğini gösterir.

2.2 Uzun Süreli Tıklama (longClick) : Notla ilgili operasyonları sunar. ( Yeni Not Ekle, Notu Düzenle, Notu Sil)

2.2.1 Yeni Not Ekle : Konu ve içerik girilerek yeni not eklenir. Konu ve içerik girilmeden ekleme yapılmak istenildiğinde  kullanıcı uyarılır.

2.2.2 Notu Düzenle: Listeden seçilen not düzenleme ekranında gösterilir ve not güncellenebilir.

2.2.3 Notu Sil: Silinmek üzere bir not seçilir. Daha sonra kullanıcıya notu silmek istediğinden emin olup olmadığı sorulur. Kullanıcı “Evet” seçtiğinde not silinir ve not listeleme ekranı yenilenir, “Hayır” seçtiğinde ise işlem iptal edilir.

**”Not Defterim” uygulamasının kaynak kodunu yazının devamında bulabilirsiniz. 

Kaynak Kod:

Sabitler.java
package DBOrnek.NotDefteri;
 
/*
* Veritabanına ait bilgiler
*/
public class Sabitler {
 
public static final String DATABASE="notdefteridb";
public static final int DATABASE_VERSION=1;
public static final String TABLO="notlar";
public static final String KONU="konu";
public static final String ICERIK="icerik";
public static final String TARIH="kayittarihi";
public static final String KEY_ID="_id";
 
}

Not.java

package DBOrnek.NotDefteri;
 
class Not {
 
public Not(int id,String k, String i, String t) {
_id=id;
konu = k;
icerik = i;
kayittarihi = t;
}
public int _id;
public String konu;
public String icerik;
public String kayittarihi;
}

NotDefteriDBHelper.java

package DBOrnek.NotDefteri;
 
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.util.Log;
 
public class NotDefteriDBhelper extends SQLiteOpenHelper {
 
private static final String CREATE_TABLE = "create table "
+ "notlar"+ " (" + Sabitler.KEY_ID
+ " integer primary key autoincrement, " + Sabitler.KONU
+ " text not null, " + Sabitler.ICERIK + " text not null, "
+ Sabitler.TARIH + " long);";
 
public NotDefteriDBhelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
}
 
@Override
public void onCreate(SQLiteDatabase db) {
Log.v("NotDefteriDBHelper OnCreate", "Tablolar oluşturuyor...");
try {
// db.execSQL("drop table if exists"+Sabitler.TABLO);
db.execSQL(CREATE_TABLE);
} catch (SQLiteException ex) {
Log.v("Tablo olusturma hatasi tespit edildi", ex.getMessage());
 
}
}
 
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w("Upgrade islemi","Tum verile silinecek !");
/*
* Yenisi geldiğinde eski tablodaki tüm veriler silinecek ve
* tablo yeniden oluşturulacak.
*/
db.execSQL("drop table if exists " + Sabitler.TABLO);
onCreate(db);
}
}

NotDefteriDatabase.java

package DBOrnek.NotDefteri;
 
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
 
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.util.Log;
 
public class NotDefteriDatabase {
 
private SQLiteDatabase db;
private final Context context;
private final NotDefteriDBhelper dbhelper;
 
//constructer
public NotDefteriDatabase(Context c) {
context = c;
//Dphelper opjesiyle yeni veritabanı oluşturuluyor.
dbhelper = new NotDefteriDBhelper(context, Sabitler.DATABASE, null,
Sabitler.DATABASE_VERSION);
}
 
/*
* Veritabanını operasyonlara kapatmak
* için kullandığımız method.
*/
public void kapat() {
db.close();
}
/*
* Veritabanını yazma ve okuma için açtığımız method
* **!**
* ->yazmak için aç, yazma operasyonu değilse exception ver catch bloğunda okumak için aç
*/
public void ac() throws SQLiteException {
try {
db = dbhelper.getWritableDatabase();
} catch (SQLiteException ex) {
Log.v("Open database exception caught", ex.getMessage());
db = dbhelper.getReadableDatabase();
}
}
 
/*
* Veritabanına not eklediğimiz method.
* insert Yapısı:
* ----db.insert(String table, String nullColumnHack, ContentValues icerikDegerleri)
*/
public long notEkle(String konu, String icerik) {
try {
ContentValues yeniDegerler = new ContentValues();
 
yeniDegerler.put(Sabitler.KONU, konu);
yeniDegerler.put(Sabitler.ICERIK, icerik);
yeniDegerler.put(Sabitler.TARIH,
java.lang.System.currentTimeMillis());
return db.insert(Sabitler.TABLO, null, yeniDegerler);
 
} catch (SQLiteException ex) {
 
Log.v("Veritabanina ekleme isleminde hata tespit edildi !",
ex.getMessage());
return -1;
}
}
 
/*
* Seçilen bir notu güncellemek için kullandığımız method
* Update yapısı:
* ------update(String table, ContentValues icerikDegerleri, String whereCumlecigi,
* String[] whereArgumanlari)
*/
 
public void notGuncelle(int id, String konu, String icerik) {
 
ContentValues guncelDegerler = new ContentValues();
String[] idArray = { String.valueOf(id) };
 
guncelDegerler.put(Sabitler.KONU, konu);
guncelDegerler.put(Sabitler.ICERIK, icerik);
guncelDegerler
.put(Sabitler.TARIH, java.lang.System.currentTimeMillis());
db.update(Sabitler.TABLO, guncelDegerler, Sabitler.KEY_ID + "=?",
idArray);
}
 
/*
* Veritabanından tüm notları keyID azalan sırada getirmek için
* kullandığımız method.
* Son eklenen notun ilk sırada gelmesi için.(Aynı işlem için Tarih bazında da sıralayabilirdik!)
*
* query yapısı :
* ---db.query(String table, String[] columns, String selection, String[] selectionArgs,
* String groupBy, String having, String orderBy)
*/
 
public Cursor tumNotlariGetir() {
 
Cursor c = db.query(Sabitler.TABLO, null, null, null, null, null,
Sabitler.KEY_ID + " desc");
 
return c;
}
 
public ArrayList<Not> tumNotlar() {
ArrayList<Not> notlar=new ArrayList<Not>();
 
Cursor c = tumNotlariGetir();
//Curson tipinde gelen notları teker teker dolaşıyoruz
if (c.moveToFirst()) {
do {
int id1 = c.getInt(c.getColumnIndex(Sabitler.KEY_ID));
String konu = c.getString(c.getColumnIndex(Sabitler.KONU));
 
String icerik = c.getString(c.getColumnIndex(Sabitler.ICERIK));
DateFormat dateFormat = DateFormat.getDateTimeInstance();
String tarih = dateFormat.format(new Date(c.getLong(c
.getColumnIndex(Sabitler.TARIH))).getTime());
Not gecici = new Not(id1, konu, icerik, tarih);
//Veritabanındaki tüm notları birer birer ArrayList'e kaydediyoruz.
notlar.add(gecici);
 
} while (c.moveToNext());
}
return notlar;
}
 
/*
* Seçilen bir notu silmek için kullandığımız method.
*Delete Yapısı :
* ------delete(String table, String whereCumlecigi, String[] whereArgumanları)
*/
 
public void idIleNotSil(int id) {
 
db.delete(Sabitler.TABLO, Sabitler.KEY_ID + "=" + id, null);
 
}
}

CustomListAdapter.java

package DBOrnek.NotDefteri;
 
import java.util.ArrayList;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
 
class CustomListAdapter extends BaseAdapter {
 
private LayoutInflater mInflater;
private ArrayList<Not> notlar;
private NotDefteriDatabase dba;
 
public CustomListAdapter(Context context) {
// Her defasında tekrardan sorulmasından kaçınmak için LayoutInflate'i belleğe alıyoruz.
mInflater = LayoutInflater.from(context);
notlar = new ArrayList<Not>();
 
//Veritabanından tüm notları al ve notlar isimli ArrayList'e ata.
dba = new NotDefteriDatabase(context);
dba.ac();
notlar=dba.tumNotlar();
dba.kapat();
}
 
public int getCount() {
return notlar.size();
}
 
public long getItemId(int position) {
return position;
}
 
public Not getItem(int i) {
return notlar.get(i);
}
 
public ArrayList<Not> notListesi() {
return notlar;
}
 
public View getView(int position, View convertView, ViewGroup parent) {
 
/* ViewHolder'ı diğer görsellerin referansını tutmak için kullanıyoruz.
* Bu sayede belirli tekniklerle her defasında findViewById() çağrımından kaçınıyoruz.
*/
ViewHolder holder;
/*
* convertView null değilse tekrardan inflate yapmadan etkin bir şekilde çağırıyoruz,
* eğer null ise viewholder'daki referanslar ilkleniyor.
*
*/
if (convertView == null) {
//adapterin kullanıldığı durumlarda notsatiri.xml dosyasının yapısı kullanılacak.
convertView = mInflater.inflate(R.layout.notsatiri, null);
 
//viewholder oluştur ve değerleri bağla.
holder = new ViewHolder();
holder.mKonu = (TextView) convertView.findViewById(R.id.konuText);
holder.mTarih = (TextView) convertView.findViewById(R.id.tarihText);
} else {
 
//var olan viewholder'ı etkin bir şekilde geri çağırıyoruz.
holder = (ViewHolder) convertView.getTag();
}
 
/*
* veritabanındaki her değeri custom olarak belirlediğimiz ve 2 adet textview'den oluşan
* layouttaki tv'lere atıyoruz.
*/
 
holder.mTarih.setText(notlar.get(position).kayittarihi);
holder.mKonu.setText(notlar.get(position).konu);
 
// holder'ı bağla, getTag olarak erişebileceğiz.
convertView.setTag(holder);
 
return convertView;
}
 
//TextView tipinde iki değeri tutuyoruz.
public class ViewHolder {
TextView mKonu;
TextView mTarih;
}
 
}

NotEkleActivity.java

package DBOrnek.NotDefteri;
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
 
public class NotEkleActivity extends Activity {
 
EditText konuET, icerikET;
Button ekleBT;
NotDefteriDatabase dba;
 
@Override
public void onCreate(Bundle savedInstanceState) {
 
super.onCreate(savedInstanceState);
setContentView(R.layout.ekleguncelle);
 
konuET = (EditText) findViewById(R.id.konuText);
icerikET = (EditText) findViewById(R.id.icerikText);
ekleBT = (Button) findViewById(R.id.opButton);
 
ekleBT.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
try {
dba = new NotDefteriDatabase(NotEkleActivity.this);
dba.ac();
 
/*
* Not ekleme alanları boş ise uyarı ver değilse notu ekle
*/
 
if(konuET.getText().length()!=0 && icerikET.getText().length()!=0){
notEkle();
}
else{
int duration = Toast.LENGTH_SHORT;
 
Toast toast = Toast.makeText(getApplicationContext(),
"Konu ve İçerik Giriniz !",
duration);
toast.show();
}
 
} catch (Exception e) {
e.printStackTrace();
}
}
});
 
}
 
/*
* EditTextlerden aldığı verileri notEkle methoduna gönderen method
*/
 
public void notEkle() {
 
dba.notEkle(konuET.getText().toString(), icerikET.getText()
.toString());
dba.kapat();
konuET.setText("");
icerikET.setText("");
 
Intent i = new Intent(NotEkleActivity.this, NotlariListeleActivity.class);
 
startActivity(i);
finish();
}
}

GuncelleActivity.java

package DBOrnek.NotDefteri;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class GuncelleActivity extends Activity {
 
private EditText konuET, icerikET;
private Button guncelleBTN;
private NotDefteriDatabase dba;
private int id;
 
@Override
public void onCreate(Bundle savedInstanceState) {
 
super.onCreate(savedInstanceState);
setContentView(R.layout.ekleguncelle);
 
//listele sayfasından gelen ID güncellenecek not id'sini temsil ediyor.
 
id=Integer.parseInt(getIntent().getExtras().get("ID").toString());
 
konuET = (EditText) findViewById(R.id.konuText);
icerikET = (EditText) findViewById(R.id.icerikText);
guncelleBTN = (Button) findViewById(R.id.opButton);
guncelleBTN.setText("Güncelle");
 
konuET.setText(getIntent().getExtras().get("KONU").toString());
icerikET.setText(getIntent().getExtras().get("ICERIK").toString());
 
guncelleBTN.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
try {
dba = new NotDefteriDatabase(GuncelleActivity.this);
dba.ac();
notGuncelle();
 
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
 
/*
* Yeni değerlerimizi alıp o ID'deki notu güncelliyoruz.
*/
 
public void notGuncelle() {
 
dba.notGuncelle(id,konuET.getText().toString(), icerikET.getText()
.toString());
dba.kapat();
 
Intent i = new Intent(GuncelleActivity.this, NotlariListeleActivity.class);
startActivity(i);
finish();
}
}

NotlariListeleActivity.java

package DBOrnek.NotDefteri;
 
import java.util.ArrayList;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Toast;
 
public class NotlariListeleActivity extends ListActivity {
 
private ArrayList<Not> notlar;
private NotDefteriDatabase dba;
private CustomListAdapter cla;
 
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listele);
 
dba = new NotDefteriDatabase(this);
dba.ac();
 
//Adapterimizi ayarlıyoruz.
cla = new CustomListAdapter(this);
setListAdapter(cla);
notlar = cla.notListesi();
 
//Eğer tabloda hiç not bulunmuyorsa, not ekleme sayfasına yönlendirme yapıyoruz.
if (notlar.size() == 0) {
yeniNot();
}
 
//Tıklamalar
kisaUzunTiklama();
 
}
 
public void kisaUzunTiklama() {
 
getListView().setOnItemClickListener(new OnItemClickListener() {
 
@Override
public void onItemClick(AdapterView<?> a, View v, int position,
long id) {
 
Context context = getApplicationContext();
 
int duration = Toast.LENGTH_SHORT;
 
Toast toast = Toast.makeText(context,
notlar.get(position).icerik.toString(), duration);
toast.show();
}
});
 
/*
*
* Listedeki itemlere uzun süreli tıklama:
* Ekrana alert dialog içinde, not ekle, güncelle ve sil seçenekleri gelir
*
*/
 
getListView().setOnItemLongClickListener(
new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> av, View v,
int pos, long id) {
final int ps = pos;
 
final CharSequence[] items = { "Yeni Not Ekle",
" Notu Düzenle", "Notu Sil" };
 
AlertDialog.Builder builder = new AlertDialog.Builder(
NotlariListeleActivity.this);
builder.setTitle(notlar.get(ps).konu.toString());
builder.setItems(items,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int item) {
 
switch (item) {
case 0:
yeniNot();
break;
case 1:
notGuncelle(ps);
break;
case 2:
notSil(ps);
break;
default:
break;
}
}
});
 
AlertDialog alert = builder.create();
alert.show();
 
return false;
 
}
});
}
 
/*
* Not ekleme activity sınıfına yönlendiren method
*/
 
public void yeniNot() {
Intent i = new Intent(NotlariListeleActivity.this,
NotEkleActivity.class);
startActivity(i);
finish();
 
}
 
/*
* Nota daie verileri alıp, not güncelleme activity sınıfına
* yönlendiren method.
*(Veriler putextra ve benzerleriyle birlikte isim,değer ikilisi olarak
*diğer aktivity sınıflarına rahatlıkla geçirilebilir.)
*/
public void notGuncelle(int ps) {
Intent i = new Intent(NotlariListeleActivity.this,
GuncelleActivity.class);
i.putExtra("ID", notlar.get(ps)._id);
i.putExtra("KONU", notlar.get(ps).konu);
i.putExtra("ICERIK", notlar.get(ps).icerik);
 
startActivity(i);
finish();
}
 
/*
* Not silmek için kullandığımız method.
* Alert dialog içerisinde kullanıcıya notu silmek eyleminden emin olup
* olmadığı sorulur. Emin ise not silinir değilse işlem iptal edilir.
*/
 
public void notSil(int p) {
final int ps = p;
 
AlertDialog.Builder builder = new AlertDialog.Builder(
NotlariListeleActivity.this);
builder.setMessage(
notlar.get(ps).konu
+ " konulu notu silmek istediğinizden emin misiniz ?")
.setCancelable(true)
.setPositiveButton("Evet",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dba.idIleNotSil(notlar.get(ps)._id);
 
int duration = Toast.LENGTH_SHORT;
//Not silindikten sonra silindi olarak bildir.
Toast toast = Toast.makeText(getApplicationContext(),
notlar.get(ps).konu.toString()
+ " silinmiştir !",
duration);
toast.show();
//Not listesini yenile
yenile();
}
})
.setNegativeButton("Hayır",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
 
}
/*
* Bir not silindikten sonra tekrardan adapter atayarak veritabanından gelen verilerle
* not listesini yeniliyoruz.
*/
public void yenile()
{
cla = null;
cla = new CustomListAdapter(getApplicationContext());
setListAdapter(cla);
if ((notlar = cla.notListesi()).size() == 0)
yeniNot();
 
}
 
}

<strong>AndroidManifest.xml</strong>
<pre class="prettyprint">
<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
       package="DBOrnek.NotDefteri" 
       android:versionCode="1" android:versionName="1.0"> 
 
     <uses-sdk android:minSdkVersion="8" /> 
 
     <application android:icon="@drawable/logo" android:label="Not Defterim">
        <activity android:name=".NotlariListeleActivity"
                  >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:launchMode="standard" android:name=".NotEkleActivity"></activity>
		<activity android:launchMode="standard" android:name=".GuncelleActivity"></activity>
 
    </application>
</manifest>

ekleguncelle.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:background="@drawable/arkaplan" xmlns:android="http://schemas.android.com/apk/res/android"> 
     <TextView 
         android:layout_width="fill_parent" 
         android:layout_height="30dip" 
         android:text="Konu" 
         android:textSize="20dip"
         android:textColor="#000000"
		 android:paddingLeft="10dip"/> 
     <EditText 
         android:id="@+id/konuText" 
         android:layout_width="fill_parent" 
         android:layout_height="40dip" 
         android:background="@drawable/rowbackground" android:paddingLeft="15dip"
         android:paddingTop="5dip"
         android:paddingRight="65dip"
         android:textColor="@android:color/white"
         /> 
     <TextView 
         android:layout_width="fill_parent" 
         android:layout_height="wrap_content" 
         android:textSize="20dip"
         android:paddingLeft="10dip"
         android:text="İçerik"
 
        android:textColor="#000000"
     /> 
     <EditText 
         android:id="@+id/icerikText" 
         android:layout_width="fill_parent" 
         android:gravity="top"
         android:textColor="@android:color/white"
         android:paddingTop="15dip"
         android:paddingBottom="15dip"
         android:paddingRight="65dip"
         android:typeface="sans"
         android:background="@drawable/rowbackground" 
		 android:paddingLeft="15dip" 
		 android:layout_height="150dip"/>      
 
     <Button android:id="@+id/opButton" 
     android:textColor="@android:color/white"     
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content"
     android:text="Ekle"
     android:background="@drawable/dikdortgenbuton"     
     android:textSize="20dp"
     android:layout_gravity="right" 
     android:layout_marginRight="15dip" 
     android:layout_marginTop="20dip"/>     
</LinearLayout>

listele.xml

<?xml version="1.0" encoding="UTF-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
	android:background="@drawable/arkaplan" android:id="@+id/linearLayout1" 
	android:layout_width="fill_parent" android:layout_height="fill_parent"  
	android:weightSum="1" android:orientation="vertical">
 
        <ListView android:layout_height="wrap_content" 
        android:id="@android:id/list" 
        android:layout_weight="0.04" 
        android:layout_width="match_parent"
        android:paddingLeft="1dip"
        android:paddingRight="1dip"
        android:paddingTop="3dip"
        android:paddingBottom="3dip">       
        </ListView>
    </LinearLayout>

notsatiri.xml

<?xml version="1.0" encoding="UTF-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/linearLayout1" android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="@drawable/rowbackground"
    android:padding="12dip" android:orientation="vertical">
 
     <TextView android:layout_width="wrap_content" 
         android:id="@+id/konuText" 
         android:layout_marginRight="4dip" android:text="Diary Title "
         android:gravity="left" 
         android:textStyle="bold" android:textSize="20dip"       
           android:layout_height="match_parent" 
            android:textColor="@android:color/white"/> 
     <TextView android:id="@+id/tarihText" 
     android:gravity="right"
         android:layout_width="wrap_content" 
         android:text="Date Recorded" 
         android:textSize="15dip" android:layout_height="match_parent"
         android:textColor="@android:color/white"/>     
    </LinearLayout>

Paylaşmış olduğum içeriğin uygulama geliştirme aşamalarınızda  yardımcı olmasını diliyorum. :) Kullandığım tüm görsel öğelerin düzenlenmesi şahsıma aittir. Saygılarımla.

Okuduğunuz için teşekkürler ;)

Kaynak Kodu Buradan İndirlebilirsiniz.

 

Kaynakça: developer.android.com, The Android  Developer’s Cookbook  Building Applications with  the Android SDK (James Steele, Nelson To ),  vogella.de, sqlite.org

,

21 Responses to Android Not Defteri Uygulaması

  1. Gökhan Akgöl diyor ki:

    Merhaba , uygulamana baktım güzel olmuş eline sağlık, ama alt tarafta verdiğin kod yapısını acemi birisinin anlaması çok çok zor aralara neyi neden yaptığını net bir şekilde açıklama satırları olarak eklersen çok daha iyi olacaktır.Tavsiye :) İyi çalışmalar.

    • Tuğrul Aşık diyor ki:

      Öncelikle yorumun ve tavsiyen için çok teşekkürler. Yorum satırlarında kodun işleyişini anlatmaya çalışıyorum; ama genel anlamda düşündüğümüzde birinin yazdığı kodu anlamanın zor olduğuda bir gerçek. Detaylandırmaya çalışırım. İyi çalışmalar. ;)

  2. gokhan qq diyor ki:

    hocam emeğinize sağlık, kodu daha rahat okuyabilmek açısından kaynak dosyalarını da paylaşabilir misiniz ?

  3. sedat diyor ki:

    merhaba;
    sizin not defteri uygulamanızı indirip baktım. Gayet iyi bir uygulama. Benim şu an yapmaya çalıştığım şey ise bunun biraz daha farklısı. listviewde başlık şeklinde olan ve görseli sizin veri tabanına kayıt yapılmasının ardından yaptığınız görüntü gibi olup, o başlıklara basıldığı zaman yeni sayfa açıp, açılan sayfada başlık hakkında bilgi veren ve bu bilgiyi veri tabanından çekecek bir uygulama. bu konuda yardımcı olabilir misiniz?

    • Tuğrul Aşık diyor ki:

      Merhabalar,
      Öncelikle ilginiz için teşekkürker. Uygulamamda Ekle,güncelle için bende yeni bir sayfaya yöneliyorum zaten. Burada yapmanız gereken listview’deki herhangi bir iteme tıkladığınızda sizinde yeni bir layout olarak oluşturduğunuz sayfaya geçiş yapmanız. Database’ten veri cekmeye gelince aynı şekilde ek bir tablo yaratın ve tablodan sorgulamak istediğiniz veriyi ekranda gösterin istediğiniz bir display yöntemi ile. Yoğun olmasam kod içeriği olarakta yardım edebilirdim. Çok politik bir cevap olacak ama biraz daha dikkat edip yoğunlaştığınızda üstesinden rahatlıkla gelebilirsiniz. Biraz sabır ve çalışma sadece tüm gereken ;). Saygılarımla iyi çalışmalar.

  4. hasan can diyor ki:

    hocam merhaba emegınıze saglık guzel olmus fakat bende eclıpse kurulu aynı kodları yazıyorum fakat hata verıyo acaba neden boyle yapıyo yardımcı olursanız sevınırım androidde cok yenıyım hatta yenı baslamak zorunda kaldım proje odevımde ıse yarayabılır aslında ben word ve excell yapıcam sanırsam bunu gelıstırebılırım dıye dusunuyorum eger yardımcı olursanız cok sevınırım sımdıden tesekkur ederım

    • Tuğrul Aşık diyor ki:

      Merhabalar,
      Aynı kodları yazmak yerine projeyi direk workspace’e import etmeyi dene. Word ve excel yapacaksan java API’lerini incelemeni öneririm. ilk başlarda basit hatalardan canının sıkılması normal, bir süre sonra hiçbir problem kalmayacaktır. İyi çalışmalar

  5. Mehmet ÖZTÜRK diyor ki:

    uygulamanızı indirdim ama çalıştıramadım yardımcı olur musunuz bird ebenzer bir proje ödevim varda sqlite veritabanındaki kayotları listwiew’e nasıl aktarabilirim?

    • Tuğrul Aşık diyor ki:

      SQLite kullanırken emülatör kullanıyor iseniz zaman zaman sıkıntı çıkartabiliyor. Diğer yandan kaynak kodu mu yoksa yazımın içinde paylaştığım kod satırlarını mı kopyalayıp çalıştırmayı denediniz. Eğer direk kaynak kodu indirdiyseniz workspace’e dökümanı kopyalayıp import etmeyi deneyin.(NOT: SDK güncellemelerinden sonraki farklardan dolayıda zaman zaman import sorunları yaşanabiliyor .) Eğer veritabanınızda az sayıda ve sabit veriler varsa direk olarak bir dosyayı assets klasörünede ekleyerek kullanabilirsiniz. Ya da veri tabanınızın her değişimde versiyonunu değiştirerek uygulamayı calıstırmayı deneyin.

      Kolay gelsin, iyi çalışmalar.

  6. Mehmet ÖZTÜRK diyor ki:

    Sayenizde proje ödevini yaptım gerçi kayıtları listeye aktarmayı öğrenemesemde yaptığınız uyguluma çok yardımcı oldu Allah razı olsun size teşekkür ederim

    • Tuğrul Aşık diyor ki:

      Merhaba,
      Yorumunuz için teşekkürler. Umarım yardımcı olmuştur. Öncesinde bir yorum yazsaydınız listeye aktarma konusunda da detaylı cevap yazabilirdim ;). İyi çalışmalar.

  7. Ahmet Selami diyor ki:

    Tuğrul bey sunumunuzdan istifade ettim ve bazı şeyleri öğrendim. Teşekkür ediyorum.
    Fakat uzun araştırmalarıma rağmen anlayamadığım bir nokta var.
    Ben sizin örneğinizdeki gibi bir listView e resimde eklemek istiyorum.
    Yani bir list.xml dosyası oluşturup içeriğine bir resim bir textView ve bir de buton eklemek istiyorum. Ve custom ListView yapısıyla bu xml elemanlarını sqlite den gelen verilerle birleştirip döndürerek bir custom listView oluşturmak istiyorum. Nasıl yapabilirim.

    • Tuğrul Aşık diyor ki:

      Selamlar,

      Yoğunluğumdan dolayı yorumuna çok geç cevap veriyorum, şu anda çözümü bulup bulmadığına emin değilim. Fakat yinede anlatayım.
      Satır icin ayrı bir xml’de dilediğin tasarımı yap. Yaptığın tasarımdaki xml’i daha sonra customlistview için kullan. Örnekte paylaştığımın aynısı, sanırım bazı detaylar dikkatinden kaçmış.

      Anladığım kadarıyla örneğin, bir aracın resmi olsun ve yanında modeli ve yılı yazsın gibi bir satır istiyorsun listede göstermek üzere. Araçları listelediğinde resimleri ve araçların bilgileri yer alsın. Tam anlamıyla format olarak bu sanırım yapmak istediğin.
      Direk yukarıda bahsettiğim adımı uygula . Biraz dikat et, küçük syntax hataları yapıyor olabilirsin ;)

      Kolay gelsin, iyi çalışmalar.

  8. Ahmet Selami diyor ki:

    Tuğrul hocam öncelikle sunumunuz için teşekkürler.
    Şimdi ben bu holder içerisinde if kullanınca sorun çıkartıyor.
    Örneğin eğer veritabanından gelen veri “şu” ise yazının rengini kırmızı yap diyorum. Fakat yapmıyor. İf yapısı içinde “0” == “0” yapıp deniyorum hepsini kırmızı renge çeviriyor. Fakat teker teker yapmıyor yardımcı olurmusunuz?

    • Tuğrul Aşık diyor ki:

      Elementlere değer atamadan önce kullan. Örneğin çift satırlar için kırmızı, tek satırlar için sarı yazı rengi kullanmak gibi. Daha önce yaptım çalıştı herhangi bir sıkıntı çıkarmadı.

      Renk vermek istediğin noktata sıkıntı olabilir. Aşağıdaki yardımcı olacaktır.

      —————————

      Kolay gelsin, iyi çalışmalar.
      /*
      * veritabanındaki her değeri custom olarak belirlediğimiz ve 2 adet textview’den oluşan
      * layouttaki tv’lere atıyoruz.
      */
      //burada … burada…
      holder.mTarih.setText(notlar.get(position).kayittarihi);
      holder.mKonu.setText(notlar.get(position).konu);

      —————————-

  9. burhan diyor ki:

    Merhaba

    Kaynak kod linki çalışmıyor acaba başka link verebilirmisiniz?

    Teşekkür ederim

  10. Ataberk Dönmez diyor ki:

    Tamda böyle bir çalışmaya ihtiyacım vardı. teşekkürler.

Bir Cevap Yazın