Bağımsız, araç içi, bilgi-eğlence sistemi başlatmak için car-ui-lib
kitaplığını kullanın
(IVI) sistemleri. Bu codelab'de, car-ui-lib
ve
kitaplıktaki bileşenleri özelleştirmek için çalışma zamanı kaynak yer paylaşımlarını (RRO'lar) kullanır.
Öğrenecekleriniz
Nasıl yapılır?
- Android uygulamanıza
car-ui-lib
bileşen dahil edin. - Android uygulamaları ve RRO'lar oluşturmak için Gradle'ı kullanın.
car-ui-lib
ile RRO'ları kullanın.
Bu codelab'de, RRO'ların işleyiş şekli açıklanmamaktadır. Görüntüleyin Çalışma zamanında bir uygulamanın kaynaklarının değerini değiştirin ve Çalışma zamanında kaynak yer paylaşımlarıyla ilgili sorunları giderme konulu videomuzu izleyin.
Başlamadan önce
Ön koşullar
Başlamadan önce şunlara sahip olduğunuzdan emin olun:
Komut satırlı bilgisayar (Linux makinesi, Mac veya Windows makinesi) Linux için Windows Alt Sistemi).
Android Studio'ya gidin.
Makinenize bağlı Android cihaz veya emülatör. Görüntüleyin Android kaynağını indirin ve Android'i oluşturun.
RRO'lar hakkında temel bilgiler.
Yeni Android uygulaması oluştur
Süre: 15 dakika
Bu bölümde yeni bir Android Studio projesi oluşturacaksınız.
Android Studio'da
EmptyActivity
içeren bir uygulama oluşturun.Şekil 1.Boş Etkinlik Oluşturma Uygulamaya
CarUiCodelab
adını verin ve Java dilini seçin. Şunları yapabilirsiniz: isterseniz bir dosya konumu da seçin. Şu öğe için varsayılan değerleri kabul edin: Ayarlar'ı tıklayın.Şekil 2. Uygulamanıza ad verin activity_main.xml
öğesini şu kod bloğuyla değiştirin:<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout 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=".MainActivity"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/sample_text" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
Bu kod bloğu, tanımlanmayan
sample_text
dizesini gösterir.sample_text
kaynak dizesini ekleyin ve "Hello World!" olarak ayarlayınstrings.xml
dosya Bu dosyayı açmak için uygulama > src > ana > çözünürlük > değerler > dizeler.xml olarak güncelleyin.<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">CarUiCodelab</string> <string name="sample_text">Hello World!</string> </resources>
Uygulamanızı oluşturmak için sağ üstteki yeşil Oynat düğmesini tıklayın. İşlem devam ediyor apk'yi emülatörünüze veya Android cihazınıza otomatik olarak yükler Gradle.
Yeni uygulama, emülatörünüzde veya Android cihazınızda otomatik olarak açılır. Eğer
CarUiCodelab
uygulamasını, şu anda yüklü olan uygulama başlatıcıdan açın.
Bu şöyle görünür:
![Yeni CarUiCodelab uygulamasını aç](https://source.android.com/static/docs/automotive/images/codelab_04.png?hl=tr)
Android uygulamanıza car-ui-lib ekleyin
Süre: 15 dakika
car-ui-lib
ürününü uygulamanıza ekleyin:
car-ui-lib
bağımlılığını projenizinbuild.gradle
dosyasına eklemek için: uygulama > build.gradle ile değiştirin. Bağımlılıklarınız aşağıdaki gibi görünmelidir:dependencies { implementation 'com.android.car.ui:car-ui-lib:2.0.0' implementation 'androidx.appcompat:appcompat:1.4.1' implementation 'com.google.android.material:material:1.4.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' }
Android uygulamanızda car-ui-lib bileşenlerini kullanma
Artık car-ui-lib
uygulamasına sahip olduğunuza göre uygulamanıza bir araç çubuğu ekleyebilirsiniz.
MainActivity.java
dosyanızda,onCreate
yönteminin üzerine yazın:@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Get the toolbar controller instance. ToolbarController toolbar = CarUi.getToolbar(this); // Set the title on toolbar. toolbar.setTitle(getTitle()); // Set the logo to be shown with the title. toolbar.setLogo(R.mipmap.ic_launcher_round); }
ToolbarController
dosyasını içe aktardığınızdan emin olun:import com.android.car.ui.core.CarUi; import com.android.car.ui.toolbar.ToolbarController;
Theme.CarUi.WithToolbar
temasını kullanmak için seçin uygulama > src > ana > AndroidManifest.xml ve ardından güncelleyinAndroidManifest.xml
şöyle görünecek:<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.example.caruicodelab"> <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.CarUi.WithToolbar" tools:targetApi="31"> <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Uygulamayı oluşturmak için önceki gibi yeşil Oynat düğmesine basın.
Uygulamanıza RRO'lar ekleyin
Süre: 30 dakika
RRO'lar hakkında bilginiz varsa bölümü, Uygulamanıza izin denetleyici ekleyin. RRO'larla ilgili temel bilgileri öğrenmek için Çalışma zamanında uygulama kaynaklarının değerini değiştirme.
Uygulamanıza izin denetleyici ekleyin
Bir RRO paketinin hangi kaynakların yer paylaşımlı olarak yer aldığını denetlemek için
Uygulamanızın /res
klasörüne overlayable.xml
. Bu dosya izin görevi görüyor
uygulamanız (hedef) ile RRO paketiniz (yer paylaşımı) arasındaki denetleyiciyi destekler.
Uygulamanıza
res/values/overlayable.xml
ekleyin ve aşağıdaki içeriği kopyalayın dosyanıza ekleyin:<?xml version="1.0" encoding="utf-8"?> <resources> <overlayable name="CarUiCodelab"> <policy type="public"> <item type="string" name="sample_text"/> </policy> </overlayable> </resources>
sample_text
dizesinin RRO ile yer paylaşımlı olması gerektiğinden kaynak adı için ekleyebilirsiniz.overlayable.xml
dosyanız,res/values/
içinde bulunması ZORUNLUDUR. Aksi haldeOverlayManagerService
bulamadı.Yer paylaşımlı kaynaklar hakkında daha fazla bilgi edinmek ve daha fazla bilgi edinmek için Yer paylaşımlı reklamları kaynaklar bölümüne göz atın.
RRO paketi oluşturma
Bu bölümde, yukarıda görüntülenen dizeyi değiştirmek için bir RRO paketi oluşturacaksınız "Hello World!" şarkısından "Hello World RRO" olarak değiştirin.
Yeni bir proje oluşturmak için Dosya > Yeni > Yeni Proje. Şunları yaptığınızdan emin olun: RRO paketleri içerdiğinden Boş Etkinlik yerine Etkinlik Yok'u seçin yalnızca kaynakları kullanın.
Yapılandırmalarınız aşağıda gösterilenlere benzer şekilde görünür. İlgili içeriği oluşturmak için kullanılan kaydedildikleri konum farklı olabilir:
Yeni
CarUiRRO
projesini oluşturduktan sonra, projeyiAndroidManifest.xml
değiştirilerek DOO.<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.caruirro"> <application android:hasCode="false" /> <uses-sdk android:minSdkVersion="29" android:targetSdkVersion="29"/> <overlay android:targetPackage="com.example.caruicodelab" android:targetName="CarUiCodelab" android:isStatic="false" android:resourcesMap="@xml/sample_overlay" /> </manifest>
Bu işlem
@xml/sample_overlay
ile ilgili bir hata oluşturur.resourcesMap
dosyası, hedef paketteki kaynak adlarını RRO paketiyle eşler.Aşağıdaki kod bloğunu
…/res/xml/sample_overlay.xml
hedefine kopyalayın:<?xml version="1.0" encoding="utf-8"?> <overlay> <item target="string/sample_text" value="@string/sample_text"/> </overlay>
sample_text
öğesini…/res/values/strings.xml
öğesine ekleyin:
.<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">CarUiRRO</string> <string name="sample_text">Hello World RRO</string> </resources>
RRO hedefinizi oluşturmak için yeşil Oynat düğmesine basarak Gradle oluşturun. veya Android cihazınızda RRO'nuzun temelini oluşturur.
RRO'nuzun düzgün şekilde yüklendiğini doğrulamak için aşağıdaki komutu çalıştırın:
shell:~$ adb shell cmd overlay list --user current | grep -i com.example com.example.caruicodelab [ ] com.example.caruirro
Bu komut, RRO paketlerinin durumuyla ilgili faydalı bilgileri gösterir kontrol edebilirsiniz.
[ ]
, RRO'nun yüklendiğini ve etkinleştirilmeye hazır olduğunu belirtir.---
, RRO'nun yüklü olduğunu ancak hata içerdiğini gösterir.[X]
, RRO'nun yüklendiği ve etkinleştirildiği anlamına gelir.
RRO'nuzda hatalar varsa Çalışma zamanında kaynak yer paylaşımlarıyla ilgili sorunları giderme inceleyin.
RRO'yu etkinleştirmek ve etkin olduğunu doğrulamak için:
shell:~$ adb shell cmd overlay enable --user current com.example.caruirro shell:~$ adb shell cmd overlay list --user current | grep -i com.example com.example.caruicodelab [x] com.example.caruirro
Uygulamanızda "Hello World RRO" dizesi görüntüleniyor.
![Merhaba Dünya RRO!](https://source.android.com/static/docs/automotive/images/codelab_09.png?hl=tr)
Tebrikler! İlk RRO'nuzu oluşturdunuz.
RRO kullanırken Android Öğe Paketleme Aracı'nı (AAPT2) kullanabilirsiniz.
--no-resource-deduping
ve --no-resource-removal
işaretleri
Bağlantı seçenekleri.
İşaretleri bu codelab'de eklemeniz gerekmez ancak kullanmanızı öneririz.
ortadan kaldırmak için RRO'larınızı kontrol edin. Siz
bunları RRO'nuzun build.gradle
dosyasına şu şekilde ekleyebilirsiniz:
android {
…
aaptOptions {
additionalParameters "--no-resource-deduping", "--no-resource-removal"
}
}
Bu işaretler hakkında daha fazla bilgi için bkz. Paketi derleyin ve AAPT2 olarak değiştirin.
Android uygulamanızda RRO'ları kullanarak car-ui-lib
bileşeni değiştirin
Bu sayfada, projenizin kendisi için bir çalışma zamanı kaynak yer paylaşımını (RRO)
Android uygulamanızda car-ui-lib
kitaplığındaki bileşenleri değiştirme.
Araç çubuğu arka plan rengini ayarlama
Süre: 15 dakika
Araç çubuğunun arka plan rengini değiştirmek için:
RRO uygulamanıza aşağıdaki değeri ekleyin ve kaynağı parlak olarak ayarlayın. yeşil (
#0F0
):<?xml version="1.0" encoding="utf-8"?> <resources> <drawable name="car_ui_toolbar_background">#0F0</drawable> </resources>
car-ui-lib
kitaplığı, adlı bir kaynak içeriyorcar_ui_toolbar_background
. Bu kaynak konfigürasyonunu devreye soktuğunda, yanlış değer emin olun.RRO'nuzun
AndroidManifest.xml
bölümündetargetName
değerini şuna işaret edecek şekilde güncelleyin:car-ui-lib
:… android:targetName="car-ui-lib" …
RRO oluşturmak istediğiniz her hedef paket için yeni bir RRO paketi oluşturmanız ZORUNLUDUR. Örneğin, iki farklı hedef için yer paylaşımları oluştururken, iki yer paylaşımlı APK oluşturun.
RRO'yu önceki gibi oluşturun, doğrulayın, yükleyin ve etkinleştirin.
Uygulamanız şu şekilde görünür:
![Yeni Araç Çubuğu arka plan rengi](https://source.android.com/static/docs/automotive/images/codelab_10.png?hl=tr)
RRO düzenleri ve stilleri
Süre: 15 dakika
Bu alıştırmada, daha önce oluşturduğunuz uygulamaya benzer yeni bir uygulama geliştireceksiniz. Bu uygulaması, düzenin yer paylaşımlı olarak yer almasına olanak tanır. Önceki adımları aynı şekilde uygulayın veya değiştirin. mevcut uygulamanız.
Aşağıdaki satırları
overlayable.xml
hedefine eklediğinizden emin olun:<?xml version="1.0" encoding="utf-8"?> <resources> <overlayable name="CarUiCodelab"> <policy type="public"> <item type="string" name="sample_text"/> <item type="layout" name="activity_main"/> <item type="id" name="textView"/> </policy> </overlayable> </resources>
activity_main.xml
ifadesinin aşağıdaki gibi göründüğünden emin olun:<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout 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=".MainActivity"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/sample_text" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
RRO uygulamanızda bir
res/layout/activity_main.xml
oluşturun ve takip etmek için:<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/sample_text" android:textAppearance="@style/TextAppearance.CarUi" android:layout_gravity="center_vertical|center_horizontal"/> </FrameLayout>
Stilimizi DGR'ye eklemek için
res/values/styles.xml
öğesini güncelleyin:<?xml version="1.0" encoding="utf-8"?> <resources> <style name="TextAppearance.CarUi" parent="android:TextAppearance.DeviceDefault"> <item name="android:textColor">#0f0</item> <item name="android:textSize">100sp</item> </style> </resources>
AndroidManifest.xml
içindekitargetName
özelliğini, şunun adına işaret edecek şekilde değiştirin: yeni uygulamanız:… android:targetName="CarUiCodelab" …
Kaynakları RRO'nuzdaki
sample_overlay.xml
dosyasına ekleyin:<?xml version="1.0" encoding="utf-8"?> <overlay> <item target="string/sample_text" value="@string/sample_text"/> <item target="id/textView" value="@id/textView"/> <item target="layout/activity_main" value="@layout/activity_main"/> </overlay>
Uygulamayı oluşturup yükleyin ve RRO öncekiyle aynı şekilde yapın (yeşil Play) düğmesi). RRO'nuzu etkinleştirdiğinizden emin olun.
Uygulama ve RRO aşağıdaki gibi oluşturulur. Hello World RRO metni yeşildir ve olarak ortalanır.
![Merhaba Dünya RRO](https://source.android.com/static/docs/automotive/images/codelab_11.png?hl=tr)
Uygulamanıza CarUiRecyclerView'u ekleyin
Süre: 15 dakika
CarUiRecyclerView
arayüzü, RecyclerView
ürününe erişmek için API'ler sunar.
car-ui-lib
kaynaklarıyla özelleştirilmiştir. Örneğin, CarUiRecyclerView
kaydırma çubuğunun etkinleştirilmesi gerekip gerekmediğini belirlemek için çalışma zamanında bir işareti kontrol eder
ve ilgili düzeni seçer.
![CarUiRecyclerViewContainer](https://source.android.com/static/docs/automotive/images/codelab_12.png?hl=tr)
CarUiRecyclerView
eklemek için şunu ekleyin:activity_main.xml
veMainActivity.java
dosya. Sıfırdan yeni bir uygulama oluşturabilir veya mevcut uygulamada değişiklik yapabilirsiniz. Mevcut uygulamada değişiklik yaparsanız,overlayable.xml
tarafından bildirilmeyen kaynaklar.activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <com.android.car.ui.recyclerview.CarUiRecyclerView android:id="@+id/list" android:layout_width="match_parent" android:layout_height="match_parent"/>
Aşağıdaki hata görünebilir, ancak bunu yoksayabilirsiniz:
Cannot resolve class com.android.car.ui.recyclerview.CarUiRecyclerView
Sınıfınızın doğru yazıldığı ve
car-ui-lib
apk'nizi oluşturup derleyebilirsiniz. Hatayı kaldırmak için Dosya > Önbellekleri Geçersiz Kıl, ardından Geçersiz Kıl ve Yeniden Başlat'ı tıklayın.Şunları ekleyin:
MainActivity.java
package com.example.caruicodelab; import android.app.Activity; import android.os.Bundle; import com.android.car.ui.core.CarUi; import com.android.car.ui.recyclerview.CarUiContentListItem; import com.android.car.ui.recyclerview.CarUiListItem; import com.android.car.ui.recyclerview.CarUiListItemAdapter; import com.android.car.ui.recyclerview.CarUiRecyclerView; import com.android.car.ui.toolbar.ToolbarController; import java.util.ArrayList; /** Activity with a simple car-ui layout. */ public class MainActivity extends Activity { private final ArrayList<CarUiListItem> mData = new ArrayList<>(); private CarUiListItemAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ToolbarController toolbar = CarUi.getToolbar(this); toolbar.setTitle(getTitle()); toolbar.setLogo(R.mipmap.ic_launcher_round); CarUiRecyclerView recyclerView = findViewById(R.id.list); mAdapter = new CarUiListItemAdapter(generateSampleData()); recyclerView.setAdapter(mAdapter); } private ArrayList<CarUiListItem> generateSampleData() { for (int i = 0; i < 20; i++) { CarUiContentListItem item = new CarUiContentListItem(CarUiContentListItem.Action.ICON); item.setTitle("Title " + i); item.setPrimaryIconType(CarUiContentListItem.IconType.CONTENT); item.setIcon(getDrawable(R.drawable.ic_launcher_foreground)); item.setBody("body " + i); mData.add(item); } return mData; }
Uygulamanızı önceki gibi derleyip yükleyin.
Artık bir CarUiRecyclerView
görürsünüz:
![CarUiRecyclerView](https://source.android.com/static/docs/automotive/images/codelab_13.png?hl=tr)
Kaydırma çubuğunu kaldırmak için RRO kullanma
Süre: 10 dakika
Bu alıştırmada,
CarUiRecyclerView
RRO'nuza aşağıdaki dosyaları ekleyin ve değiştirin:
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.caruirro"> <application android:hasCode="false" /> <uses-sdk android:minSdkVersion="29" android:targetSdkVersion="29"/> <overlay android:targetPackage="com.example.caruicodelab" android:targetName="car-ui-lib" android:isStatic="false" android:resourcesMap="@xml/sample_overlay" /> </manifest>
res/values/bools.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <bool name="car_ui_scrollbar_enable">false</bool> </resources>
car_ui_scrollbar_enable
kaynağı,car-ui-lib
boole kaynağıdır ve arabanın kaydırma çubuğunun Yukarı ve Aşağı düğmeleriyle optimize edilip edilmediğini kontrol edenCarUiRecyclerView
sınırları içindedir.false
olarak ayarlandığındaCarUiRecyclerView
, AndroidXRecyclerView
gibi çalışır.res/xml/sample_overlay.xml
<?xml version="1.0" encoding="utf-8"?> <overlay> <item target="bool/car_ui_scrollbar_enable" value="@bool/car_ui_scrollbar_enable"/> </overlay>
Uygulamanızı önceki gibi derleyip yükleyin. Kaydırma çubuğu
CarUiRecyclerView
:
![Kaydırma çubuğu olmadan CarUiRecyclerView](https://source.android.com/static/docs/automotive/images/codelab_14.png?hl=tr)
CarUiRecyclerView kaydırma çubuğunu yer paylaşımlı olarak eklemek için bir düzen kullanma
Süre: 15 dakika
Bu alıştırmada CarUiRecyclerView
kaydırma çubuğu düzenini değiştireceksiniz.
RRO uygulamanıza aşağıdaki dosyaları ekleyin ve değiştirin.
res/layout/car_ui_recycler_view_scrollbar.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="112dp" android:layout_height="match_parent" android:id="@+id/car_ui_scroll_bar"> <!-- View height is dynamically calculated during layout. --> <View android:id="@+id/car_ui_scrollbar_thumb" android:layout_width="6dp" android:layout_height="20dp" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:background="@drawable/car_ui_recyclerview_scrollbar_thumb"/> <View android:id="@+id/car_ui_scrollbar_track" android:layout_width="10dp" android:layout_height="match_parent" android:layout_marginTop="10dp" android:layout_centerHorizontal="true" android:layout_above="@+id/car_ui_scrollbar_page_up"/> <View android:layout_width="2dp" android:layout_height="match_parent" android:layout_marginTop="10dp" android:background="#323232" android:layout_toLeftOf="@+id/car_ui_scrollbar_thumb" android:layout_above="@+id/car_ui_scrollbar_page_up" android:layout_marginRight="5dp"/> <View android:layout_width="2dp" android:layout_height="match_parent" android:layout_marginTop="10dp" android:background="#323232" android:layout_toRightOf="@+id/car_ui_scrollbar_thumb" android:layout_above="@+id/car_ui_scrollbar_page_up" android:layout_marginLeft="5dp"/> <ImageView android:id="@+id/car_ui_scrollbar_page_up" android:layout_width="75dp" android:layout_height="75dp" android:focusable="false" android:hapticFeedbackEnabled="false" android:src="@drawable/car_ui_recyclerview_ic_up" android:scaleType="centerInside" android:background="?android:attr/selectableItemBackgroundBorderless" android:layout_centerHorizontal="true" android:layout_above="@+id/car_ui_scrollbar_page_down"/> <ImageView android:id="@+id/car_ui_scrollbar_page_down" android:layout_width="75dp" android:layout_height="75dp" android:focusable="false" android:hapticFeedbackEnabled="false" android:src="@drawable/car_ui_recyclerview_ic_down" android:scaleType="centerInside" android:background="?android:attr/selectableItemBackgroundBorderless" android:layout_centerHorizontal="true" android:layout_alignParentBottom="true"/> </RelativeLayout>
Bir düzen dosyası yer paylaşımlı olarak eklemek için tüm kimlikleri ve ad alanını eklemeniz gerekir RRO'nuzun
overlay.xml
özelliğine ilişkin özelliklerdir. Aşağıdaki dosyalara göz atın.res/xml/sample_overlay.xml
<?xml version="1.0" encoding="utf-8"?> <overlay> <item target="drawable/car_ui_recyclerview_ic_down" value="@drawable/car_ui_recyclerview_ic_down"/> <item target="drawable/car_ui_recyclerview_ic_up" value="@drawable/car_ui_recyclerview_ic_up"/> <item target="drawable/car_ui_recyclerview_scrollbar_thumb" value="@drawable/car_ui_recyclerview_scrollbar_thumb"/> <item target="id/car_ui_scroll_bar" value="@id/car_ui_scroll_bar"/> <item target="id/car_ui_scrollbar_thumb" value="@id/car_ui_scrollbar_thumb"/> <item target="id/car_ui_scrollbar_track" value="@id/car_ui_scrollbar_track"/> <item target="id/car_ui_scrollbar_page_up" value="@id/car_ui_scrollbar_page_up"/> <item target="id/car_ui_scrollbar_page_down" value="@id/car_ui_scrollbar_page_down"/> <item target="layout/car_ui_recyclerview_scrollbar" value="@layout/car_ui_recyclerview_scrollbar"/> </overlay>
res/drawable/car_ui_recyclerview_ic_up.xml
<?xml version="1.0" encoding="utf-8"?> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="48dp" android:height="48dp" android:viewportWidth="48.0" android:viewportHeight="48.0"> <path android:pathData="M14.83,30.83L24,21.66l9.17,9.17L36,28 24,16 12,28z" android:fillColor="#0000FF"/> </vector>
res/drawable/car_ui_recyclerview_ic_down.xml
<?xml version="1.0" encoding="utf-8"?> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="48dp" android:height="48dp" android:viewportWidth="48.0" android:viewportHeight="48.0"> <path android:pathData="M14.83,16.42L24,25.59l9.17,-9.17L36,19.25l-12,12 -12,-12z" android:fillColor="#0000FF"/> </vector>
res/drawable/car_ui_recyclerview_scrollbar_thumb.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="#0000FF" /> <corners android:radius="100dp"/> </shape>
Bu dosyaların etkileşim şeklini incelemeniz önerilir.
Kolaylık sağlaması açısından boyutlar ve renkler sabit kodlanmıştır. Ancak en iyi bu değerleri
dimens.xml
vecolors.xml
içinde bildirmeniz gerekir. hattares/color/
klasöründe renk dosyaları olarak atanmış olabilir. Daha fazla bilgi edinmek için bkz. Katkıda bulunanlar için AOSP Java kod stili.Uygulamanızı önceki gibi derleyip yükleyin.
CarUiRecyclerView
kurulumunu tamamladınız gri çubuklar bulunuyor.
Tebrikler! Kaydırma çubuğunun alt kısmında her iki ok da görünür.
Gradle derlemesi kullanılarak car-ui-lib
düzen kaynak dosyasına RRO başarıyla uygulandı
sistemi nasıl yönetebileceğinizi
öğrendiniz.
![Gri raylı mavi bir kaydırma çubuğu olan CarUiRecyclerView](https://source.android.com/static/docs/automotive/images/codelab_15.png?hl=tr)
RRO Listesi öğeleri
Süre: 15 dakika
Bu noktaya kadar çerçeveyi kullanarak car-ui-lib
bileşene RRO uyguladınız
bileşenler (AndroidX değil) AndroidX bileşenlerini RRO'da kullanmak için
bu bileşenin hem uygulamaya hem de RRO'ya olan bağımlılıklarını build.gradle.
bu bileşenin attrs
değerini de uygulamanızda overlayable.xml
öğesine eklemelidir
RRO'nuzdaki sample_overlay.xml
olarak ayarlanır.
Kitaplığımızda (car-ui-lib
) ConstraintLayout
ile diğer AndroidX'ler kullanılır
oluşturur, dolayısıyla overlayable.xml
aşağıdaki gibi görünebilir:
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<overlayable name="car-ui-lib">
…
<item type="attr" name="layout_constraintBottom_toBottomOf"/>
<item type="attr" name="layout_constraintBottom_toTopOf"/>
<item type="attr" name="layout_constraintCircle"/>
<item type="attr" name="layout_constraintCircleAngle"/>
<item type="attr" name="layout_constraintCircleRadius"/>
<item type="attr" name="layout_constraintDimensionRatio"/>
<item type="attr" name="layout_constraintEnd_toEndOf"/>
<item type="attr" name="layout_constraintEnd_toStartOf"/>
<item type="attr" name="layout_constraintGuide_begin"/>
<item type="attr" name="layout_constraintGuide_end"/>
<item type="attr" name="layout_constraintGuide_percent"/>
<item type="attr" name="layout_constraintHeight_default"/>
<item type="attr" name="layout_constraintHeight_max"/>
<item type="attr" name="layout_constraintHeight_min"/>
<item type="attr" name="layout_constraintHeight_percent"/>
<item type="attr" name="layout_constraintHorizontal_bias"/>
<item type="attr" name="layout_constraintHorizontal_chainStyle"/>
<item type="attr" name="layout_constraintHorizontal_weight"/>
<item type="attr" name="layout_constraintLeft_creator"/>
<item type="attr" name="layout_constraintLeft_toLeftOf"/>
<item type="attr" name="layout_constraintLeft_toRightOf"/>
<item type="attr" name="layout_constraintRight_creator"/>
<item type="attr" name="layout_constraintRight_toLeftOf"/>
<item type="attr" name="layout_constraintRight_toRightOf"/>
<item type="attr" name="layout_constraintStart_toEndOf"/>
<item type="attr" name="layout_constraintStart_toStartOf"/>
<item type="attr" name="layout_constraintTag"/>
<item type="attr" name="layout_constraintTop_creator"/>
<item type="attr" name="layout_constraintTop_toBottomOf"/>
<item type="attr" name="layout_constraintTop_toTopOf"/>
<item type="attr" name="layout_constraintVertical_bias"/>
<item type="attr" name="layout_constraintVertical_chainStyle"/>
…
</overlayable>
</resources>
CarUiRecyclerView
içindeki liste öğelerinin düzenini aşağıdakileri kullanarak değiştirin:ConstraintLayout
. RRO'nuza aşağıdaki dosyaları ekleyin veya değiştirin:res/xml/sample_overlay.xml
<?xml version="1.0" encoding="utf-8"?> <overlay> <item target="id/car_ui_list_item_touch_interceptor" value="@id/car_ui_list_item_touch_interceptor"/> <item target="id/car_ui_list_item_reduced_touch_interceptor" value="@id/car_ui_list_item_reduced_touch_interceptor"/> <item target="id/car_ui_list_item_start_guideline" value="@id/car_ui_list_item_start_guideline"/> <item target="id/car_ui_list_item_icon_container" value="@id/car_ui_list_item_icon_container"/> <item target="id/car_ui_list_item_icon" value="@id/car_ui_list_item_icon"/> <item target="id/car_ui_list_item_content_icon" value="@id/car_ui_list_item_content_icon"/> <item target="id/car_ui_list_item_avatar_icon" value="@id/car_ui_list_item_avatar_icon"/> <item target="id/car_ui_list_item_title" value="@id/car_ui_list_item_title"/> <item target="id/car_ui_list_item_body" value="@id/car_ui_list_item_body"/> <item target="id/car_ui_list_item_action_container_touch_interceptor" value="@id/car_ui_list_item_action_container_touch_interceptor"/> <item target="id/car_ui_list_item_action_container" value="@id/car_ui_list_item_action_container"/> <item target="id/car_ui_list_item_action_divider" value="@id/car_ui_list_item_action_divider"/> <item target="id/car_ui_list_item_switch_widget" value="@id/car_ui_list_item_switch_widget"/> <item target="id/car_ui_list_item_checkbox_widget" value="@id/car_ui_list_item_checkbox_widget"/> <item target="id/car_ui_list_item_radio_button_widget" value="@id/car_ui_list_item_radio_button_widget"/> <item target="id/car_ui_list_item_supplemental_icon" value="@id/car_ui_list_item_supplemental_icon"/> <item target="id/car_ui_list_item_end_guideline" value="@id/car_ui_list_item_end_guideline"/> <item target="attr/layout_constraintBottom_toBottomOf" value="@attr/layout_constraintBottom_toBottomOf"/> <item target="attr/layout_constraintBottom_toTopOf" value="@attr/layout_constraintBottom_toTopOf"/> <item target="attr/layout_constraintEnd_toEndOf" value="@attr/layout_constraintEnd_toEndOf"/> <item target="attr/layout_constraintEnd_toStartOf" value="@attr/layout_constraintEnd_toStartOf"/> <item target="attr/layout_constraintGuide_begin" value="@attr/layout_constraintGuide_begin"/> <item target="attr/layout_constraintGuide_end" value="@attr/layout_constraintGuide_end"/> <item target="attr/layout_constraintHorizontal_bias" value="@attr/layout_constraintHorizontal_bias"/> <item target="attr/layout_constraintLeft_toLeftOf" value="@attr/layout_constraintLeft_toLeftOf"/> <item target="attr/layout_constraintLeft_toRightOf" value="@attr/layout_constraintLeft_toRightOf"/> <item target="attr/layout_constraintRight_toLeftOf" value="@attr/layout_constraintRight_toLeftOf"/> <item target="attr/layout_constraintRight_toRightOf" value="@attr/layout_constraintRight_toRightOf"/> <item target="attr/layout_constraintStart_toEndOf" value="@attr/layout_constraintStart_toEndOf"/> <item target="attr/layout_constraintStart_toStartOf" value="@attr/layout_constraintStart_toStartOf"/> <item target="attr/layout_constraintTop_toBottomOf" value="@attr/layout_constraintTop_toBottomOf"/> <item target="attr/layout_constraintTop_toTopOf" value="@attr/layout_constraintTop_toTopOf"/> <item target="attr/layout_goneMarginBottom" value="@attr/layout_goneMarginBottom"/> <item target="attr/layout_goneMarginEnd" value="@attr/layout_goneMarginEnd"/> <item target="attr/layout_goneMarginLeft" value="@attr/layout_goneMarginLeft"/> <item target="attr/layout_goneMarginRight" value="@attr/layout_goneMarginRight"/> <item target="attr/layout_goneMarginStart" value="@attr/layout_goneMarginStart"/> <item target="attr/layout_goneMarginTop" value="@attr/layout_goneMarginTop"/> <item target="attr/layout_constraintVertical_chainStyle" value="@attr/layout_constraintVertical_chainStyle"/> <item target="layout/car_ui_list_item" value="@layout/car_ui_list_item"/> </overlay>
res/layout/car_ui_list_item.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout 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" android:tag="carUiListItem" android:minHeight="@dimen/car_ui_list_item_height"> <!-- The following touch interceptor views are sized to encompass the specific sub-sections of the list item view to easily control the bounds of a background ripple effects. --> <com.android.car.ui.SecureView android:id="@+id/car_ui_list_item_touch_interceptor" android:layout_width="0dp" android:layout_height="0dp" android:background="@drawable/car_ui_list_item_background" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <!-- This touch interceptor does not include the action container --> <com.android.car.ui.SecureView android:id="@+id/car_ui_list_item_reduced_touch_interceptor" android:layout_width="0dp" android:layout_height="0dp" android:background="@drawable/car_ui_list_item_background" android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@id/car_ui_list_item_action_container" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/car_ui_list_item_start_guideline" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_begin="@dimen/car_ui_list_item_start_inset" /> <FrameLayout android:id="@+id/car_ui_list_item_icon_container" android:layout_width="@dimen/car_ui_list_item_icon_container_width" android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="@+id/car_ui_list_item_start_guideline" app:layout_constraintTop_toTopOf="parent"> <ImageView android:id="@+id/car_ui_list_item_icon" android:layout_width="@dimen/car_ui_list_item_icon_size" android:layout_height="@dimen/car_ui_list_item_icon_size" android:layout_gravity="center" android:visibility="gone" android:scaleType="fitCenter" /> <ImageView android:id="@+id/car_ui_list_item_content_icon" android:layout_width="@dimen/car_ui_list_item_content_icon_width" android:layout_height="@dimen/car_ui_list_item_content_icon_height" android:layout_gravity="center" android:visibility="gone" android:scaleType="fitCenter" /> <ImageView android:id="@+id/car_ui_list_item_avatar_icon" android:background="@drawable/car_ui_list_item_avatar_icon_outline" android:layout_width="@dimen/car_ui_list_item_avatar_icon_width" android:layout_height="@dimen/car_ui_list_item_avatar_icon_height" android:layout_gravity="center" android:visibility="gone" android:scaleType="fitCenter" /> </FrameLayout> <CarUiTextView android:id="@+id/car_ui_list_item_title" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/car_ui_list_item_text_start_margin" android:singleLine="@bool/car_ui_list_item_single_line_title" android:textAppearance="@style/TextAppearance.CarUi.ListItem" android:layout_gravity="right" android:gravity="right" android:textAlignment="viewEnd" app:layout_constraintBottom_toTopOf="@+id/car_ui_list_item_body" app:layout_constraintEnd_toStartOf="@+id/car_ui_list_item_action_container" app:layout_constraintStart_toEndOf="@+id/car_ui_list_item_icon_container" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_chainStyle="packed" app:layout_goneMarginStart="@dimen/car_ui_list_item_text_no_icon_start_margin" /> <CarUiTextView android:id="@+id/car_ui_list_item_body" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/car_ui_list_item_text_start_margin" android:textAppearance="@style/TextAppearance.CarUi.ListItem.Body" android:layout_gravity="right" android:gravity="right" android:textAlignment="viewEnd" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/car_ui_list_item_action_container" app:layout_constraintStart_toEndOf="@+id/car_ui_list_item_icon_container" app:layout_constraintTop_toBottomOf="@+id/car_ui_list_item_title" app:layout_goneMarginStart="@dimen/car_ui_list_item_text_no_icon_start_margin" /> <!-- This touch interceptor is sized and positioned to encompass the action container --> <com.android.car.ui.SecureView android:id="@+id/car_ui_list_item_action_container_touch_interceptor" android:layout_width="0dp" android:layout_height="0dp" android:background="@drawable/car_ui_list_item_background" android:visibility="gone" app:layout_constraintBottom_toBottomOf="@id/car_ui_list_item_action_container" app:layout_constraintEnd_toEndOf="@id/car_ui_list_item_action_container" app:layout_constraintStart_toStartOf="@id/car_ui_list_item_action_container" app:layout_constraintTop_toTopOf="@id/car_ui_list_item_action_container" /> <FrameLayout android:id="@+id/car_ui_list_item_action_container" android:layout_width="wrap_content" android:minWidth="@dimen/car_ui_list_item_icon_container_width" android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="@+id/car_ui_list_item_end_guideline" app:layout_constraintTop_toTopOf="parent"> <View android:id="@+id/car_ui_list_item_action_divider" android:layout_width="@dimen/car_ui_list_item_action_divider_width" android:layout_height="@dimen/car_ui_list_item_action_divider_height" android:layout_gravity="start|center_vertical" android:background="@drawable/car_ui_list_item_divider" /> <Switch android:id="@+id/car_ui_list_item_switch_widget" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:clickable="false" android:focusable="false" /> <CheckBox android:id="@+id/car_ui_list_item_checkbox_widget" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:clickable="false" android:focusable="false" /> <RadioButton android:id="@+id/car_ui_list_item_radio_button_widget" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:clickable="false" android:focusable="false" /> <ImageView android:id="@+id/car_ui_list_item_supplemental_icon" android:layout_width="@dimen/car_ui_list_item_supplemental_icon_size" android:layout_height="@dimen/car_ui_list_item_supplemental_icon_size" android:layout_gravity="center" android:scaleType="fitCenter" /> </FrameLayout> <androidx.constraintlayout.widget.Guideline android:id="@+id/car_ui_list_item_end_guideline" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_end="@dimen/car_ui_list_item_end_inset" /> </androidx.constraintlayout.widget.ConstraintLayout>
car_ui_list_item.xml
bazı bileşenlere referans veriyor, Kaynaklar ve diğer kaynakları da kullanabilirsiniz. Bunlarcar-ui-lib
kaynaktır.car-ui-lib
hesabını şu hesap olarak ekleyerek bu sorunu düzeltebilirsiniz:app/build.gradle
içinde RRO uygulamanıza bir bağımlılık:dependencies { implementation 'com.android.car.ui:car-ui-lib:2.0.0' implementation 'androidx.appcompat:appcompat:1.4.1' implementation 'com.google.android.material:material:1.4.0' }
Başlık ve Gövde artık sola hizalı değil, sağa hizalandı.
![Sağa hizalı Başlık ve Gövde](https://source.android.com/static/docs/automotive/images/codelab_16.png?hl=tr)
AndroidX bileşenlerini kullanarak car-ui-lib
için yalnızca RRO uyguladık
özellikleri car-ui-lib
altında olduğunda (ConstraintLayout
)
overlayable.xml
adlı dosya ve RRO sample_overlay.xml
. İnsanların
aynı şeyi kendi uygulamanızda da yapabilirsiniz. İlgili tüm alanları eklemeniz
Uygulamanızın overlayable.xml
kimliğine attrs
benzer. car-ui-lib
ile benzer.
Ancak, aşağıdaki durumlarda AndroidX bileşenlerini kullanan bir uygulamanın RRO yayınlanması mümkün değildir
uygulama, build.gradle
öğesinde bağımlılık olarak car-ui-lib
içeriyor (uygulama
car-ui-lib
bileşen). Özellik eşlemeleri
car-ui-lib
kitaplığının overlayable.xml
öğesine giderek
uygulamasının car-ui-lib
içeren overlayable.xml
özelliği,
mergeDebugResources
hatası. Çünkü bu özellikler
birden fazla overlayable.xml
dosyasında mevcut:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:mergeDebugResources'