MDC-102 Android: Materyal Yapı ve Düzen (Java)

logo_components_color_2x_web_96dp.png

Malzeme Bileşenleri (MDC), geliştiricilerin Materyal Tasarım'ı uygulamasına yardımcı olur. Google'da bir mühendis ve kullanıcı deneyimi tasarımcıları ekibi tarafından oluşturulan MDC, onlarca güzel ve işlevsel kullanıcı arayüzü bileşenine sahiptir ve Android, iOS, web ve Flutter için kullanılabilir.

material.io/develop

codelab MDC-101'de giriş sayfası oluşturmak için iki Materyal Bileşeni (MDC) kullandınız: Metin alanları ve düğmeler. Şimdi de gezinme, yapı ve veri ekleyerek bu temeli genişletelim.

Geliştireceğiniz uygulama

Bu codelab'de, kıyafet ve ev eşyaları satan bir e-ticaret uygulaması olan Shrine adlı uygulama için bir ana ekran oluşturacaksınız. Şunları içerir:

  • En iyi uygulama çubuğu
  • Ürünlerin ızgara listesi

MDC-Android bu codelab'deki bileşenler

  • UygulamaBarDüzeni
  • MalzemeKartı Görünümü

Gerekenler

  • Android geliştirmeyle ilgili temel bilgiler
  • Android Studio(henüz yoksa buradan indirin)
  • Android emülatörü veya cihaz (Android Studio üzerinden kullanılabilir)
  • Örnek kod (sonraki adıma bakın)

Android uygulamaları oluşturma deneyiminizi nasıl değerlendirirsiniz?

Acemi Orta Yetkili

MDC-101'den devam ediyor musunuz?

MDC-101'i tamamladıysanız kodunuz bu codelab için hazır olmalıdır. 3. adıma geçebilirsiniz: En iyi uygulama çubuğu ekleme.

Sıfırdan mı başlıyorsunuz?

Starter codelab uygulamasını indirme

Starter uygulamasını indirin

Başlangıç uygulaması, material-components-android-codelabs-102-starter/java dizininde bulunur. Başlamadan önce bu dizine cd girdiğinizden emin olun.

...veya GitHub'dan klonlayın

Bu codelab'i GitHub'dan klonlamak için aşağıdaki komutları çalıştırın:

git clone https://github.com/material-components/material-components-android-codelabs
cd material-components-android-codelabs/
git checkout 102-starter

Android Studio'da başlangıç kodunu yükleme

  1. Kurulum sihirbazı tamamlandığında ve Android Studio'ya hoş geldiniz penceresi gösterildiğinde Mevcut bir Android Studio projesini aç'ı tıklayın. Örnek kodu yüklediğiniz dizine gidin ve Heykel projesini açmak için java -> Temple'ı (veya bilgisayar üzerinde arama yapın) seçin.
  2. Android Studio'nun projeyi oluşturması ve senkronize etmesi için biraz bekleyin. Bu işlem, Android Studio penceresinin alt kısmındaki etkinlik göstergeleri tarafından gösterilmektedir.
  3. Bu aşamada Android Studio, aşağıda gösterildiği gibi Android SDK'sı veya derleme araçları eksik olduğu için bazı derleme hatalarını ortaya çıkarabilir. Bu uygulamaları yüklemek/güncellemek ve projenizi senkronize etmek için Android Studio'daki talimatları uygulayın.

Proje bağımlılıkları ekleme

Projenin MDC Android destek kitaplığına bağımlı olması gerekir. İndirdiğiniz örnek kodun bu bağımlılık zaten listelenmesi gerekir ancak emin olmak için aşağıdaki adımları uygulamanız önerilir.

  1. app modülü build.gradle dosyasına gidin ve dependencies bloğunun MDC Android'de bir bağımlılık içerdiğinden emin olun:
api 'com.google.android.material:material:1.1.0-alpha06'
  1. (İsteğe bağlı) Gerekirse aşağıdaki bağımlılıkları eklemek ve projeyi senkronize etmek için build.gradle dosyasını düzenleyin.
dependencies {
    api 'com.google.android.material:material:1.1.0-alpha06'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    implementation 'com.android.volley:volley:1.1.1'
    implementation 'com.google.code.gson:gson:2.8.5'
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.21"
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:core:1.1.0'
    androidTestImplementation 'androidx.test.ext:junit:1.1.0'
    androidTestImplementation 'androidx.test:runner:1.2.0-alpha05'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0-alpha05'
}

Starter uygulamasını çalıştırma

  1. Çalıştır / Oynat düğmesinin solundaki derleme yapılandırmasının app olduğundan emin olun.
  2. Uygulamayı oluşturmak ve çalıştırmak için yeşil Çalıştır / Oynat düğmesine basın.
  3. Kullanabileceğiniz cihazlarda halihazırda bir Android cihaz varsa Dağıtım Hedefi Seçin penceresinde 8. Adıma geçin. Aksi takdirde, Yeni Sanal Cihaz Oluştur'u tıklayın.
  4. Donanım Seç ekranında, Pixel 2 gibi bir telefon cihazını seçin ve ardından İleri'yi tıklayın.
  5. Sistem Resmi ekranında yeni bir Android sürümü (tercihen en yüksek API seviyesi) seçin. Yüklü değilse gösterilen İndir bağlantısını tıklayın ve indirme işlemini tamamlayın.
  6. İleri'yi tıklayın.
  7. Android Virtual Device (AVD) ekranında, ayarları olduğu gibi bırakın ve Finish (Son) seçeneğini tıklayın.
  8. Dağıtım hedefi iletişim kutusundan bir Android cihaz seçin.
  9. Tamam'ı tıklayın.
  10. Android Studio uygulamayı oluşturur, dağıtır ve hedef cihazda otomatik olarak açar.

İşlem başarılı! MDC-101 codelab'den Tapınak girişi sayfasını göreceksiniz.

Giriş ekranı iyi göründüğüne göre şimdi uygulamayı bazı ürünlerle dolduralım.

Giriş ekranı kapatıldığında ana ekran, "Bunu yaptın!" yazan bir ekranla gösterilir. Harika! Ancak şimdi kullanıcımızın herhangi bir işlem yapması veya uygulamada nerede olduğuna dair bir algısı yok. Bu konuda yardımcı olmak için gezinme ekleyelim.

Materyal Tasarım, yüksek derecede kullanılabilirlik sağlayan gezinme kalıpları sunar. En önemli gezinme bileşenlerinden biri üst sıradaki uygulama çubuğudur.

Gezinme sağlamak ve kullanıcıların diğer işlemlere hızlı bir şekilde erişmesini sağlamak için üst uygulama çubuğu ekleyelim.

AppBar widget'ı ekleme

shr_product_grid_fragment.xml içinde "Şunu yaptın!" ifadesini içeren <LinearLayout> etiketini silin. TextView öğesini aşağıdakiyle değiştirin:

shr_product_grid_fragment.xml

<com.google.android.material.appbar.AppBarLayout
   android:layout_width="match_parent"
   android:layout_height="wrap_content">

   <androidx.appcompat.widget.Toolbar
       android:id="@+id/app_bar"
       style="@style/Widget.Shrine.Toolbar"
       android:layout_width="match_parent"
       android:layout_height="?attr/actionBarSize"
       app:title="@string/shr_app_name" />
</com.google.android.material.appbar.AppBarLayout>

shr_product_grid_fragment.xml alanınız aşağıdaki gibi görünmelidir:

shr_product_grid_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context=".ProductGridFragment">

   <com.google.android.material.appbar.AppBarLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content">

       <androidx.appcompat.widget.Toolbar
           android:id="@+id/app_bar"
           style="@style/Widget.Shrine.Toolbar"
           android:layout_width="match_parent"
           android:layout_height="?attr/actionBarSize"
           app:title="@string/shr_app_name" />
   </com.google.android.material.appbar.AppBarLayout>
  
</FrameLayout>

Çoğu uygulama çubuğunda başlığın yanında bir düğme bulunur. Hesabımıza menü simgesi ekleyelim.

Gezinme simgesi ekleme

shr_product_grid_fragment.xml ürünündeyken aşağıdakileri Toolbar düzeninize ekleyin (düzeninize yeni eklediğiniz):

shr_product_grid_fragment.xml

app:navigationIcon="@drawable/shr_menu"

shr_product_grid_fragment.xml alanınız aşağıdaki gibi görünmelidir:

shr_product_grid_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context=".ProductGridFragment">
  
   <com.google.android.material.appbar.AppBarLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content">

       <androidx.appcompat.widget.Toolbar
           android:id="@+id/app_bar"
           style="@style/Widget.Shrine.Toolbar"
           android:layout_width="match_parent"
           android:layout_height="?attr/actionBarSize"
           app:navigationIcon="@drawable/shr_menu"
           app:title="@string/shr_app_name" />
   </com.google.android.material.appbar.AppBarLayout>
  
</FrameLayout>

İşlem düğmeleri ekleme ve üst uygulama çubuğunun stilini belirleme

Uygulama çubuğunun sonuna da düğmeler ekleyebilirsiniz. Android'de bu düğmelere işlem düğmeleri denir.

Üst uygulama çubuğunun stilini biçimlendirip menüsüne menü simgesi için işlem düğmeleri ekleriz.

Öncelikle araç çubuğunu kurmak için bir yöntem oluşturalım. Yöntem, id etiketini kullanarak araç çubuğuna ilişkin bir referans almalı ve ayrıca, getActivity()'ı kullanarak etkinliğe atıfta bulunmalıdır. Etkinlik boş değilse Toolbar öğesini, setSupportActionBar kullanarak ActionBar olarak kullanılacak şekilde ayarlayın:

ProductGRFragment.java

private void setUpToolbar(View view) {
   Toolbar toolbar = view.findViewById(R.id.app_bar);
   AppCompatActivity activity = (AppCompatActivity) getActivity();
   if (activity != null) {
       activity.setSupportActionBar(toolbar);
   }
}

Ardından, az önce eklediğimiz setUpToolbar yönteminin hemen altında, shr_toolbar_menu.xml içeriğini araç çubuğuna eklemek için onCreateOptionsMenu kodunu geçersiz kılalım:

ProductGRFragment.java

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) {
   menuInflater.inflate(R.menu.shr_toolbar_menu, menu);
   super.onCreateOptionsMenu(menu, menuInflater);
}

Şimdi, onCreateView() yönteminin içeriğine eklediğimiz setUpToolbar yöntemine aşağıdaki bilgilerle bir çağrı ekleyin:

ProductGRFragment.java

@Override
public View onCreateView(
       @NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
   // Inflate the layout for this fragment with the ProductGrid theme
   View view = inflater.inflate(R.layout.shr_product_grid_fragment, container, false);

   // Set up the toolbar
   setUpToolbar(view);

   return view;
}

Son olarak, ProductGridFragment.java öğesine bir onCreate() yöntemi ekleyin. Yöntem gövdesinde setHasOptionMenu parametresini true olarak ayarlayın.

Yöntem şu şekilde görünmelidir:

ProductGRFragment.java

@Override
public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setHasOptionsMenu(true);
}

Yukarıdaki kod, XML düzenimizdeki uygulama çubuğunu bu etkinliğin İşlem Çubuğu olacak şekilde ayarlar. Geri çağırma onCreateOptionsMenu, etkinliğe menümüz olarak ne kullanılacağını bildirir. Bu durumda, R.menu.shr_toolbar_menu menüsündeki menü öğeleri uygulama çubuğuna yerleştirilir.

Menü dosyası iki öğe içerir: &quotArama ve Filtre.

shr_Araç_Menü.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto">
   <item
       android:id="@+id/search"
       android:icon="@drawable/shr_search"
       android:title="@string/shr_search_title"
       app:showAsAction="always" />
   <item
       android:id="@+id/filter"
       android:icon="@drawable/shr_filter"
       android:title="@string/shr_filter_title"
       app:showAsAction="always" />
</menu>

Bu değişikliklerden sonra ProductGridFragment.java dosyanız aşağıdaki gibi görünecektir:

ProductGRFragment.java

package com.google.codelabs.mdc.java.shrine;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toolbar;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;


public class ProductGridFragment extends Fragment {

   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setHasOptionsMenu(true);
   }
  
   @Override
   public View onCreateView(
           @NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       // Inflate the layout for this fragment with the ProductGrid theme
       View view = inflater.inflate(R.layout.shr_product_grid_fragment, container, false);

       // Set up the toolbar
       setUpToolbar(view);

       return view;
   }
  
   private void setUpToolbar(View view) {
       Toolbar toolbar = view.findViewById(R.id.app_bar);
       AppCompatActivity activity = (AppCompatActivity) getActivity();
       if (activity != null) {
           activity.setSupportActionBar(toolbar);
       }
   }

   @Override
   public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) {
       menuInflater.inflate(R.menu.shr_toolbar_menu, menu);
       super.onCreateOptionsMenu(menu, menuInflater);
   }

}

Üretin ve çalıştırın. Ana ekranınız aşağıdaki gibi görünmelidir:

Artık araç çubuğunda bir gezinme simgesi, başlık ve sağ tarafta iki işlem simgesi bulunmaktadır. Araç çubuğu, yükseltiyi gölgeden farklı bir katmanda gösteren küçük bir gölge kullanarak da gösterir.

Uygulamamız artık bir yapıya sahip olduğuna göre içeriği kartlara yerleştirerek düzenleyelim.

Kart ekleme

En üstteki uygulama çubuğunun altına bir kart ekleyerek başlayalım. Kartta bir resim için bir bölge, bir başlık ve ikincil metin için bir etiket bulunmalıdır.

shr_product_grid_fragment.xml içinde , AppBarLayout altında aşağıdakileri ekleyin:

shr_product_grid_fragment.xml

<com.google.android.material.card.MaterialCardView
   android:layout_width="160dp"
   android:layout_height="180dp"
   android:layout_marginBottom="16dp"
   android:layout_marginLeft="16dp"
   android:layout_marginRight="16dp"
   android:layout_marginTop="70dp"
   app:cardBackgroundColor="?attr/colorPrimaryDark"
   app:cardCornerRadius="4dp">

   <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_gravity="bottom"
       android:background="#FFFFFF"
       android:orientation="vertical"
       android:padding="8dp">

       <TextView
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:padding="2dp"
           android:text="@string/shr_product_title"
           android:textAppearance="?attr/textAppearanceHeadline6" />

       <TextView
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:padding="2dp"
           android:text="@string/shr_product_description"
           android:textAppearance="?attr/textAppearanceBody2" />
   </LinearLayout>
</com.google.android.material.card.MaterialCardView>

Oluşturma ve çalıştırma:

Bu önizlemede, kartın ekranın sol kenarından yerleştirildiğini ve yuvarlatılmış köşelere ve bir gölgeye (kartın yüksekliğini ifade eden) sahip olduğunu görebilirsiniz. Bu alanın tamamına "kapsayıcı" denir. Kapsayıcının yanı sıra içindeki tüm öğeler de isteğe bağlıdır.

Bir kapsayıcıya şu öğeleri ekleyebilirsiniz: başlık metni, küçük resim veya avatar, alt başlık metni, ayırıcılar, hatta düğmeler ve simgeler. Örneğin, az önce oluşturduğumuz kartta, kartın alt kısmına uyumlu LinearLayout şeklinde iki TextView var (biri başlık, diğeri ikincil metin için).

Kartlar genellikle başka kartlarla bir koleksiyonda gösterilir. Bu codelab'in bir sonraki bölümünde, ayarları bir ızgarada koleksiyon olarak düzenleyeceğiz.

Bir ekranda birden çok kart varsa, bunlar bir veya daha fazla koleksiyonda gruplanır. Izgara içindeki kartlar ortak plana sahiptir. Diğer bir deyişle, birbirleriyle aynı dinlenme rakımına sahiptirler (toplanmadıkları veya sürüklenmedikleri sürece, ancak bu codelab'de ele alınmayacaktır).

Kart ızgarasını ayarlama

Sizin için sağladığımız shr_product_card.xml dosyasına göz atın:

shr_product_card.xml

<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.card.MaterialCardView 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="wrap_content"
   app:cardBackgroundColor="@android:color/white"
   app:cardElevation="2dp"
   app:cardPreventCornerOverlap="true">

   <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:orientation="vertical">

       <com.android.volley.toolbox.NetworkImageView
           android:id="@+id/product_image"
           android:layout_width="match_parent"
           android:layout_height="@dimen/shr_product_card_image_height"
           android:background="?attr/colorPrimaryDark"
           android:scaleType="centerCrop" />

       <LinearLayout
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:orientation="vertical"
           android:padding="16dp">

           <TextView
               android:id="@+id/product_title"
               android:layout_width="match_parent"
               android:layout_height="wrap_content"
               android:text="@string/shr_product_title"
               android:textAppearance="?attr/textAppearanceHeadline6" />

           <TextView
               android:id="@+id/product_price"
               android:layout_width="match_parent"
               android:layout_height="wrap_content"
               android:text="@string/shr_product_description"
               android:textAppearance="?attr/textAppearanceBody2" />
       </LinearLayout>
   </LinearLayout>
</com.google.android.material.card.MaterialCardView>

Bu kart düzeninde resim içeren bir kart (URL'den resimler eklememize olanak tanıyan bir NetworkImageView) ve iki TextViews bulunur.

Ardından, sizin için sunduğumuz ProductCardRecyclerViewAdapter cihazına göz atın. ProductGridFragment ile aynı pakette.

ProductCardRecyclerViewAdapter.java

package com.google.codelabs.mdc.java.shrine;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.google.codelabs.mdc.java.shrine.network.ImageRequester;
import com.google.codelabs.mdc.java.shrine.network.ProductEntry;

import java.util.List;

/**
* Adapter used to show a simple grid of products.
*/
public class ProductCardRecyclerViewAdapter extends RecyclerView.Adapter<ProductCardViewHolder> {

   private List<ProductEntry> productList;
   private ImageRequester imageRequester;

   ProductCardRecyclerViewAdapter(List<ProductEntry> productList) {
       this.productList = productList;
       imageRequester = ImageRequester.getInstance();
   }

   @NonNull
   @Override
   public ProductCardViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
       View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.shr_product_card, parent, false);
       return new ProductCardViewHolder(layoutView);
   }

   @Override
   public void onBindViewHolder(@NonNull ProductCardViewHolder holder, int position) {
       // TODO: Put ViewHolder binding code here in MDC-102
   }

   @Override
   public int getItemCount() {
       return productList.size();
   }
}

Yukarıdaki adaptör sınıfı, ızgaramızın içeriğini yönetir. Her bir görüntülemenin verilen içerikle ne yapması gerektiğini belirlemek için kısa süre içinde onBindViewHolder() kodunu yazacağız.

Ayrıca, aynı pakete ProductCardViewHolder göz atabilirsiniz. Bu sınıfta, kart düzenimizi etkileyen görünümler depolanır. Böylece bu görünümler daha sonra değiştirilebilir.

ProductCardViewHolder.java

package com.google.codelabs.mdc.java.shrine;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import android.view.View;

public class ProductCardViewHolder extends RecyclerView.ViewHolder {

   public ProductCardViewHolder(@NonNull View itemView) {
       super(itemView);
       // TODO: Find and store views from itemView
   }
}

Izgaramızı kurmak için önce shr_product_grid_fragment.xml yer tutucusunu MaterialCardView kaldırmamız gerekiyor. Ardından, kart ızgaramızı temsil eden bileşeni eklemeniz gerekir. Bu durumda, shr_product_grid_fragment.xml cihazınıza AppBarLayout XML bileşeninizin altına bir RecyclerView bileşeni ekleyin:

shr_product_grid_fragment.xml

<androidx.core.widget.NestedScrollView
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:layout_marginTop="56dp"
   android:background="@color/productGridBackgroundColor"
   android:paddingStart="@dimen/shr_product_grid_spacing"
   android:paddingEnd="@dimen/shr_product_grid_spacing"
   app:layout_behavior="@string/appbar_scrolling_view_behavior">

   <androidx.recyclerview.widget.RecyclerView
       android:id="@+id/recycler_view"
       android:layout_width="match_parent"
       android:layout_height="match_parent" />

</androidx.core.widget.NestedScrollView>

shr_product_grid_fragment.xml alanınız aşağıdaki gibi görünmelidir:

shr_product_grid_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context=".ProductGridFragment">

   <com.google.android.material.appbar.AppBarLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content">

       <androidx.appcompat.widget.Toolbar
           android:id="@+id/app_bar"
           style="@style/Widget.Shrine.Toolbar"
           android:layout_width="match_parent"
           android:layout_height="?attr/actionBarSize"
           app:navigationIcon="@drawable/shr_menu"
           app:title="@string/shr_app_name" />
   </com.google.android.material.appbar.AppBarLayout>

   <androidx.core.widget.NestedScrollView
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:layout_marginTop="56dp"
       android:background="@color/productGridBackgroundColor"
       android:paddingStart="@dimen/shr_product_grid_spacing"
       android:paddingEnd="@dimen/shr_product_grid_spacing"
       app:layout_behavior="@string/appbar_scrolling_view_behavior">

       <androidx.recyclerview.widget.RecyclerView
           android:id="@+id/recycler_view"
           android:layout_width="match_parent"
           android:layout_height="match_parent" />

   </androidx.core.widget.NestedScrollView>

</FrameLayout>

Son olarak, onCreateView() öğesini setUpToolbar(view) numarasını çağırdıktan sonra ve return ifadesinden önce ProductGridFragment.java koduna ekleyin:

ProductGRFragment.java

@Override
public View onCreateView(
       @NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
   ...
   setUpToolbar(view);

   // Set up the RecyclerView
   RecyclerView recyclerView = view.findViewById(R.id.recycler_view);
   recyclerView.setHasFixedSize(true);
   recyclerView.setLayoutManager(new GridLayoutManager(getContext(), 2, GridLayoutManager.VERTICAL, false));
   ProductCardRecyclerViewAdapter adapter = new ProductCardRecyclerViewAdapter(
           ProductEntry.initProductEntryList(getResources()));
   recyclerView.setAdapter(adapter);
   int largePadding = getResources().getDimensionPixelSize(R.dimen.shr_product_grid_spacing);
   int smallPadding = getResources().getDimensionPixelSize(R.dimen.shr_product_grid_spacing_small);
   recyclerView.addItemDecoration(new ProductGridItemDecoration(largePadding, smallPadding));

   return view;
}

Yukarıdaki kod snippet'i, RecyclerView kurulumu için gereken ilk kullanıma hazırlama adımlarını içerir. Bu, RecyclerView's düzeni yöneticisinin ayarlanmasını, RecyclerView' adaptörünün başlatılmasını ve ayarlanmasını da içerir.

ProductGridFragment.java dosyanız artık şu şekilde görünmelidir:

ProductGRFragment.java

package com.google.codelabs.mdc.java.shrine;

import android.os.Bundle;
import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toolbar;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.GridLayoutManager;


import com.google.codelabs.mdc.java.shrine.network.ProductEntry;

public class ProductGridFragment extends Fragment {

   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setHasOptionsMenu(true);
   }

   @Override
   public View onCreateView(
           @NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       // Inflate the layout for this fragment with the ProductGrid theme
       View view = inflater.inflate(R.layout.shr_product_grid_fragment, container, false);

       // Set up the toolbar
       setUpToolbar(view);

       // Set up the RecyclerView
       RecyclerView recyclerView = view.findViewById(R.id.recycler_view);
       recyclerView.setHasFixedSize(true);
       recyclerView.setLayoutManager(new GridLayoutManager(getContext(), 2, GridLayoutManager.VERTICAL, false));
       ProductCardRecyclerViewAdapter adapter = new ProductCardRecyclerViewAdapter(
               ProductEntry.initProductEntryList(getResources()));
       recyclerView.setAdapter(adapter);
       int largePadding = getResources().getDimensionPixelSize(R.dimen.shr_product_grid_spacing);
       int smallPadding = getResources().getDimensionPixelSize(R.dimen.shr_product_grid_spacing_small);
       recyclerView.addItemDecoration(new ProductGridItemDecoration(largePadding, smallPadding));

       return view;
   }

   private void setUpToolbar(View view) {
       Toolbar toolbar = view.findViewById(R.id.app_bar);
       AppCompatActivity activity = (AppCompatActivity) getActivity();
       if (activity != null) {
           activity.setSupportActionBar(toolbar);
       }
   }

   @Override
   public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) {
       menuInflater.inflate(R.menu.shr_toolbar_menu, menu);
       super.onCreateOptionsMenu(menu, menuInflater);
   }

}

Üretin ve çalıştırın.

Kartlar kullanıma sunuldu. Henüz bir şey göstermedikleri için bazı ürün verileri ekleyelim.

Resim ve metin ekleme

Her kart için bir resim, ürün adı ve fiyat ekleyin. ViewHolder soyutlamamız her kartın görüntüleme sayısını içerir. ViewHolder görünümünde, üç görünümü şu şekilde ekleyin:

ProductCardViewHolder.java

package com.google.codelabs.mdc.java.shrine;

import androidx.recyclerview.widget.RecyclerView;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.NonNull;

import com.android.volley.toolbox.NetworkImageView;

public class ProductCardViewHolder extends RecyclerView.ViewHolder {

   public NetworkImageView productImage;
   public TextView productTitle;
   public TextView productPrice;

   public ProductCardViewHolder(@NonNull View itemView) {
       super(itemView);
       productImage = itemView.findViewById(R.id.product_image);
       productTitle = itemView.findViewById(R.id.product_title);
       productPrice = itemView.findViewById(R.id.product_price);
   }
}

RecyclerView&#39 adaptörümüzde, ViewHolder, görünümünde, her görünümdeki bilgileri ayarlamak için onBindViewHolder() yöntemini güncelleyin:

ProductCardRecyclerViewAdapter.java

@Override
public void onBindViewHolder(@NonNull ProductCardViewHolder holder, int position) {
   if (productList != null && position < productList.size()) {
       ProductEntry product = productList.get(position);
       holder.productTitle.setText(product.title);
       holder.productPrice.setText(product.price);
       imageRequester.setImageFromUrl(holder.productImage, product.url);
   }
}

Yukarıdaki kod, RecyclerView' adaptörümüze ViewHolder kullanarak her kartla ne yapılacağını bildirir.

Burada her bir ViewHolder üzerindeki TextView için metin verilerini ayarlar ve URL'den resim almak için bir ImageRequester çağırır. ImageRequester, size kolaylık sağlamak için sağladığımız bir sınıftır ve Volley kitaplığını kullanır (bu codelab'in kapsamı dışında bir konudur ancak kodu kendiniz de keşfedebilirsiniz).

Oluşturma ve çalıştırma:

Ürünlerimiz artık uygulamada gösteriliyor.

Uygulamamız, kullanıcıyı giriş ekranından bir ana ekrana götüren ve ürünlerin görüntülenebileceği bir ana akışa sahiptir. Yalnızca birkaç satır kodla üst başlığın, üç düğmenin ve üstünün bulunduğu bir uygulama çubuğu ekledik. Uygulama içeriğimizi göstermek için de bir kart ızgarası ekledik. Artık ana ekranımız basit ve işlevsel, temel bir yapıya ve uygulanabilir içeriğe sahip.

Sonraki adımlar

Üstteki uygulama çubuğu, kart, metin alanı ve düğmeyle MDC-Android kitaplığındaki dört Materyal Tasarım bileşenini kullandık. MDC-Android Catalog MDC Android bileşenlerindeki diğer bileşenleri keşfedebilirsiniz.

Uygulamamız son derece işlevsel olsa da henüz herhangi bir markayı ifade etmemektedir. MDC-103: Renk, Şekil, Tırmanma ve Tür ile Materyal Tasarım Temalı uygulamasında canlı ve modern bir marka göstermek için bu bileşenlerin stilini özelleştireceğiz.

Bu codelab'i makul bir süre ve çabayla tamamlayabildim

Kesinlikle katılıyorum Katılıyorum Nötr Katılmıyorum Kesinlikle katılmıyorum

Gelecekte Materyal Bileşenlerini kullanmaya devam etmek istiyorum

Kesinlikle katılıyorum Katılıyorum Nötr Katılmıyorum Kesinlikle katılmıyorum