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

,

%d blogcu bunu beğendi: