1. Güncellenmiş activity_main.xml
<?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:gravity="center" android:padding="24dp" android:background="@drawable/bg_gradient"> <!-- Günün Sözü Kartı --> <androidx.cardview.widget.CardView android:id="@+id/cardView" android:layout_width="match_parent" android:layout_height="wrap_content" android:elevation="8dp" app:cardCornerRadius="16dp" app:cardBackgroundColor="@color/white"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="24dp"> <ImageView android:layout_width="60dp" android:layout_height="60dp" android:src="@drawable/ic_quote" android:layout_gravity="center"/> <TextView android:id="@+id/tvSoz" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="18sp" android:textColor="@color/black" android:textStyle="italic" android:gravity="center" android:layout_marginTop="16dp" android:lineSpacingExtra="4dp"/> <TextView android:id="@+id/tvYazar" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="14sp" android:textColor="@color/gray" android:gravity="end" android:layout_marginTop="16dp" android:fontFamily="sans-serif-medium"/> </LinearLayout> </androidx.cardview.widget.CardView> <!-- Butonlar --> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginTop="32dp" android:gravity="center" android:weightSum="3"> <!-- Favori Butonu --> <ImageButton android:id="@+id/btnFavori" android:layout_width="0dp" android:layout_height="48dp" android:layout_weight="1" android:src="@drawable/ic_favorite_border" android:background="?attr/selectableItemBackgroundBorderless" android:tint="@color/purple_500"/> <!-- Yenile Butonu --> <Button android:id="@+id/btnYenile" android:layout_width="0dp" android:layout_height="48dp" android:layout_weight="1" android:text="YENİLE" android:backgroundTint="@color/purple_500" android:textColor="@color/white" android:layout_marginHorizontal="8dp"/> <!-- Paylaş Butonu --> <ImageButton android:id="@+id/btnPaylas" android:layout_width="0dp" android:layout_height="48dp" android:layout_weight="1" android:src="@drawable/ic_share" android:background="?attr/selectableItemBackgroundBorderless" android:tint="@color/purple_500"/> </LinearLayout> <!-- Widget Butonu --> <Button android:id="@+id/btnWidget" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="WIDGET EKLE" android:layout_marginTop="16dp" android:backgroundTint="@color/teal_700" android:textColor="@color/white"/> </LinearLayout>
2. Güncellenmiş MainActivity.kt
import android.appwidget.AppWidgetManager import android.content.ComponentName import android.content.Intent import android.graphics.Color import android.os.Bundle import android.widget.* import androidx.appcompat.app.AppCompatActivity import androidx.cardview.widget.CardView import androidx.core.content.ContextCompat class MainActivity : AppCompatActivity() { private lateinit var currentSoz: Pair<String, String> private val favoriSozler = mutableListOf<Pair<String, String>>() private val sozler = listOf( "Hayat bir bisiklet sürmek gibidir..." to "Albert Einstein", "Kod yazmak, şiir yazmaya benzer..." to "Linus Torvalds", // Diğer sözler... ) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val tvSoz = findViewById<TextView>(R.id.tvSoz) val tvYazar = findViewById<TextView>(R.id.tvYazar) val btnYenile = findViewById<Button>(R.id.btnYenile) val btnFavori = findViewById<ImageButton>(R.id.btnFavori) val btnPaylas = findViewById<ImageButton>(R.id.btnPaylas) val btnWidget = findViewById<Button>(R.id.btnWidget) val cardView = findViewById<CardView>(R.id.cardView) // İlk sözü göster rastgeleSozGoster(tvSoz, tvYazar) // Yenile Butonu btnYenile.setOnClickListener { rastgeleSozGoster(tvSoz, tvYazar) cardView.animate().rotationXBy(360f).setDuration(500).start() btnFavori.setImageResource(R.drawable.ic_favorite_border) } // Favori Butonu btnFavori.setOnClickListener { if (favoriSozler.contains(currentSoz)) { favoriSozler.remove(currentSoz) btnFavori.setImageResource(R.drawable.ic_favorite_border) Toast.makeText(this, "Favorilerden kaldırıldı", Toast.LENGTH_SHORT).show() } else { favoriSozler.add(currentSoz) btnFavori.setImageResource(R.drawable.ic_favorite_filled) Toast.makeText(this, "Favorilere eklendi", Toast.LENGTH_SHORT).show() } } // Paylaş Butonu btnPaylas.setOnClickListener { val paylasMetni = "${currentSoz.first} - ${currentSoz.second}" val intent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, paylasMetni) type = "text/plain" } startActivity(Intent.createChooser(intent, "Sözü Paylaş")) } // Widget Butonu btnWidget.setOnClickListener { val widgetIntent = Intent(this, SozWidgetProvider::class.java).apply { action = AppWidgetManager.ACTION_APPWIDGET_UPDATE putExtra("SOZ", currentSoz.first) putExtra("YAZAR", currentSoz.second) } val ids = AppWidgetManager.getInstance(application) .getAppWidgetIds(ComponentName(application, SozWidgetProvider::class.java)) widgetIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids) sendBroadcast(widgetIntent) Toast.makeText(this, "Widget güncellendi!", Toast.LENGTH_SHORT).show() } } private fun rastgeleSozGoster(sozTextView: TextView, yazarTextView: TextView) { currentSoz = sozler.random() sozTextView.text = "\"${currentSoz.first}\"" yazarTextView.text = "- ${currentSoz.second}" } }
3. Yeni Gerekli Dosyalar
res/drawable/ic_favorite_border.xml (Vector Asset)
<vector android:height="24dp" android:viewportWidth="24" android:viewportHeight="24" xmlns:android="http://schemas.android.com/apk/res/android"> <path android:fillColor="#FF000000" android:pathData="M16.5,3c-1.74,0 -3.41,0.81 -4.5,2.09C10.91,3.81 9.24,3 7.5,3 4.42,3 2,5.42 2,8.5c0,3.78 3.4,6.86 8.55,11.54L12,21.35l1.45,-1.32C18.6,15.36 22,12.28 22,8.5 22,5.42 19.58,3 16.5,3zM12.1,18.55l-0.1,0.1 -0.1,-0.1C7.14,14.24 4,11.39 4,8.5 4,6.5 5.5,5 7.5,5c1.54,0 3.04,0.99 3.57,2.36h1.87C13.46,5.99 14.96,5 16.5,5c2,0 3.5,1.5 3.5,3.5 0,2.89 -3.14,5.74 -7.9,10.05z"/> </vector>
res/drawable/ic_favorite_filled.xml (Vector Asset)
<vector android:height="24dp" android:viewportWidth="24" android:viewportHeight="24" xmlns:android="http://schemas.android.com/apk/res/android"> <path android:fillColor="#FF000000" android:pathData="M12,21.35l-1.45,-1.32C5.4,15.36 2,12.28 2,8.5 2,5.42 4.42,3 7.5,3c1.74,0 3.41,0.81 4.5,2.09C13.09,3.81 14.76,3 16.5,3 19.58,3 22,5.42 22,8.5c0,3.78 -3.4,6.86 -8.55,11.54L12,21.35z"/> </vector>
res/drawable/ic_share.xml (Vector Asset)
<vector android:height="24dp" android:viewportWidth="24" android:viewportHeight="24" xmlns:android="http://schemas.android.com/apk/res/android"> <path android:fillColor="#FF000000" android:pathData="M18,16.08c-0.76,0 -1.44,0.3 -1.96,0.77L8.91,12.7c0.05,-0.23 0.09,-0.46 0.09,-0.7s-0.04,-0.47 -0.09,-0.7l7.05,-4.11c0.54,0.5 1.25,0.81 2.04,0.81 1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3 -3,1.34 -3,3c0,0.24 0.04,0.47 0.09,0.7L8.04,9.81C7.5,9.31 6.79,9 6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.79,0 1.5,-0.31 2.04,-0.81l7.12,4.16c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.61 1.31,2.92 2.92,2.92 1.61,0 2.92,-1.31 2.92,-2.92s-1.31,-2.92 -2.92,-2.92z"/> </vector>
4. Widget İçin Gerekli Sınıflar
SozWidgetProvider.kt
import android.appwidget.AppWidgetManager import android.appwidget.AppWidgetProvider import android.content.Context import android.widget.RemoteViews class SozWidgetProvider : AppWidgetProvider() { override fun onUpdate( context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray ) { appWidgetIds.forEach { appWidgetId -> val views = RemoteViews(context.packageName, R.layout.widget_soz) // SharedPreferences'ten son sözü al val prefs = context.getSharedPreferences("SozPrefs", Context.MODE_PRIVATE) val soz = prefs.getString("son_soz", "Söz yükleniyor...") val yazar = prefs.getString("son_yazar", "") views.setTextViewText(R.id.widget_tvSoz, "\"$soz\"") views.setTextViewText(R.id.widget_tvYazar, "- $yazar") appWidgetManager.updateAppWidget(appWidgetId, views) } } }
res/xml/widget_info.xml
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="294dp"
android:minHeight="146dp"
android:updatePeriodMillis="86400000"
android:initialLayout="@layout/widget_soz"
android:resizeMode="horizontal|vertical"
android:widgetCategory="home_screen"/>res/layout/widget_soz.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="@drawable/widget_bg" android:padding="16dp"> <TextView android:id="@+id/widget_tvSoz" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="14sp" android:textColor="@color/black" android:textStyle="italic"/> <TextView android:id="@+id/widget_tvYazar" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="12sp" android:layout_marginTop="8dp" android:gravity="end"/> </LinearLayout>
Özellikler:
Favori Yönetimi: Kalp ikonuyla favorilere ekleme/çıkarma
Sosyal Paylaşım: Tüm uygulamalara paylaşım desteği
Widget Entegrasyonu: Ana ekranda günün sözünü gösterir
Animasyonlar: Kart dönme efekti ve renk geçişleri
Veri Kalıcılığı: SharedPreferences ile son sözü saklama
Uygulamayı çalıştırmak için AndroidManifest.xml'e widget provider'ı eklemeyi unutmayın!
0 Yorumlar