คำถามติดแท็ก android-architecture-components

คอลเล็กชันใหม่ของไลบรารีที่ช่วยคุณออกแบบแอป Android ที่มีประสิทธิภาพทดสอบได้และบำรุงรักษาได้ เริ่มต้นด้วยคลาสสำหรับการจัดการวงจรการใช้งานส่วนประกอบ UI ของคุณและการจัดการความคงอยู่ของข้อมูล

10
AndroidX คืออะไร
ฉันกำลังอ่านเกี่ยวกับห้องสมุดห้องของ Android ผมเห็นพวกเขาเปลี่ยนแพคเกจการandroid androidxฉันไม่เข้าใจว่า มีคนอธิบายได้ไหม implementation "androidx.room:room-runtime:$room_version" annotationProcessor "androidx.room:room-compiler:$room_version" แม้จะมีให้ใช้งานในandroidแพ็คเกจด้วย implementation "android.arch.persistence.room:runtime:$room_version" annotationProcessor "android.arch.persistence.room:compiler:$room_version" สิ่งที่ต้องการบรรจุไลบรารีการสนับสนุนใหม่ในandroidxแทนที่จะเป็นandroid? ใช้ตัวพิมพ์และปัจจัยที่มีผลต่อโครงการที่มีอยู่

9
เมื่อใดจึงควรใช้ RxJava ใน Android และเมื่อใดควรใช้ LiveData จากส่วนประกอบทางสถาปัตยกรรมของ Android
ฉันไม่ได้รับเหตุผลในการใช้ RxJava ใน Android และ LiveData จากส่วนประกอบทางสถาปัตยกรรมของ Android มันจะมีประโยชน์มากหากการอธิบายและการใช้ความแตกต่างระหว่างทั้งสองพร้อมกับตัวอย่างตัวอย่างในรูปแบบของรหัสซึ่งอธิบายความแตกต่างระหว่างทั้งสอง

8
ห้องสมุดห้องติดตา ลบทั้งหมด
ฉันจะลบรายการทั้งหมดบนตารางที่ระบุโดยใช้ห้องสมุดการคงอยู่ของห้องได้อย่างไร ฉันต้องการวางตาราง แต่ไม่สามารถหาข้อมูลใด ๆ ได้ เมื่อฐานข้อมูลกำลังโยกย้ายหรือโหลดรายการทั้งหมดและลบออก :)

22
ViewModelProviders เลิกใช้แล้วใน 1.1.0
มองไปที่เอกสารของ GoogleสำหรับViewModelพวกเขาแสดงให้เห็นด้านล่างโค้ดตัวอย่างเกี่ยวกับวิธีการที่จะได้รับViewModel: val model = ViewModelProviders.of(this).get(MyViewModel::class.java) เมื่อใช้การพึ่งพาล่าสุดไม่มีระดับดังกล่าวandroid.arch.lifecycle:extensions:1.1.1ViewModelProviders ไปที่เอกสารสำหรับViewModelProvidersฉันเห็นความคิดเห็นว่า: คลาสนี้เลิกใช้แล้วในระดับ API 1.1.0 ใช้ ViewModelProvider.AndroidViewModelFactory ปัญหาคือเมื่อพยายามใช้ViewModelProvider.AndroidViewModelFactoryไม่พบofวิธีการที่เทียบเท่าเพื่อรับอินสแตนซ์ของไฟล์ViewModel. สิ่งที่ฉันพยายามทำ: ViewModelProvider.AndroidViewModelFactory.getInstance(application).create(PlayerViewHolder::class.java) ดังนั้นชื่อของเมธอดcreateฉันจึงได้รับอินสแตนซ์ใหม่ของ ViewModel ทุกครั้งที่เรียกมันซึ่งไม่ใช่สิ่งที่ฉันเป็น มีความคิดใดบ้างที่จะแทนที่โค้ดที่เลิกใช้งานด้านบน

3
AndroidViewModel vs ViewModel
ด้วยการแนะนำของห้องสมุด Android สถาปัตยกรรมองค์ประกอบในชั้นเรียนใหม่ ๆ ที่ถูกนำมารวมทั้งและAndroidViewModel ViewModelอย่างไรก็ตามฉันมีปัญหาในการค้นหาความแตกต่างระหว่างสองคลาสนี้ เอกสารชัดถ้อยชัดคำอธิบายAndroidViewModelดังต่อไปนี้: แอปพลิเคชันตระหนักถึงบริบท ViewModel ฉันซาบซึ้งในความกะทัดรัด แต่สิ่งนี้บอกเป็นนัย ๆ ว่าอะไร? เมื่อเราควรเลือกที่จะใช้AndroidViewModelมากกว่าViewModelและในทางกลับกัน?

14
ไม่สามารถแก้ไขสัญลักษณ์ ViewModelProviders บน AppCompatActivity
สวัสดีฉันกำลังพยายามทำให้ ViewModel ของฉันทำงาน แต่ยังไม่มีโชค Cannot resolve symbol 'ViewModelProviders'ข้อผิดพลาดการแสดง Android สตูดิโอ ทุกคำถามอื่น ๆ ผมพบว่าในหัวข้อนี้ได้รับการแก้ไขextends Activityไปextends AppCompatActivityแต่ฉันกำลังขยายหนึ่งที่เหมาะสม ไม่แน่ใจว่าฉันพลาดอะไร ... รหัสของฉันอ้างอิงจากวิดีโอ YouTube นี้ MainActivity.java public class MainActivity extends AppCompatActivity implements TileAdapter.TileAdapterOnClickHandler { private BaseViewModel viewModel; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //set Toolbar Toolbar myToolbar = findViewById(R.id.toolbar); setSupportActionBar(myToolbar); //initialize viewModel viewModel …

12
วิธีล้างแถบการนำทางหลังจากนำทางไปยังส่วนอื่นใน Android
ฉันใช้ส่วนประกอบสถาปัตยกรรมการนำทางใหม่ใน Android และฉันติดอยู่ในการล้างสแต็กการนำทางหลังจากย้ายไปยังส่วนใหม่ ตัวอย่าง: ฉันอยู่ใน loginFragment และฉันต้องการให้ส่วนนี้ถูกล้างออกจากสแต็กเมื่อฉันไปที่โฮมแฟรกเมนต์เพื่อไม่ให้ผู้ใช้กลับไปที่ loginFragment เมื่อเขากดปุ่มย้อนกลับ ฉันใช้NavHostFragment.findNavController (Fragment) .navigate (R.id.homeFragment) อย่างง่ายเพื่อนำทาง รหัสปัจจุบัน: mAuth.signInWithCredential(credential) .addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { NavHostFragment.findNavController(LoginFragment.this).navigate(R.id.homeFragment); } else { Log.w(TAG, "signInWithCredential:failure", task.getException()); } } }); ฉันลองใช้NavOptionsในการนำทาง ()แต่ปุ่มย้อนกลับยังคงส่งฉันกลับไปที่ loginFragment NavOptions.Builder navBuilder = new NavOptions.Builder(); NavOptions navOptions …

9
ห้องสมุดความคงอยู่ของห้อง Android: อัปเดต
ไลบรารีความคงอยู่ของ Room ของ Android มีคำอธิบายประกอบ @Insert และ @Update ที่ใช้กับวัตถุหรือคอลเล็กชัน อย่างไรก็ตามฉันมีกรณีการใช้งาน (การแจ้งเตือนแบบพุชที่มีโมเดล) ที่ต้องใช้ UPSERT เนื่องจากข้อมูลอาจมีหรือไม่มีอยู่ในฐานข้อมูล Sqlite ไม่มีการเพิ่มขึ้นโดยกำเนิดและวิธีแก้ปัญหาจะอธิบายไว้ในคำถาม SOนี้ จากวิธีแก้ปัญหาที่นั่นเราจะนำไปใช้กับ Room ได้อย่างไร เพื่อให้เจาะจงมากขึ้นฉันจะใช้การแทรกหรือการอัปเดตในห้องที่ไม่ทำลายข้อ จำกัด ของคีย์แปลกปลอมได้อย่างไร การใช้การแทรกกับ onConflict = REPLACE จะทำให้ onDelete สำหรับคีย์ต่างประเทศใด ๆ ในแถวนั้นถูกเรียก ในกรณีของฉัน onDelete ทำให้เกิดการเรียงซ้อนและการใส่แถวใหม่จะทำให้แถวในตารางอื่นที่มีคีย์นอกนั้นถูกลบ นี่ไม่ใช่พฤติกรรมที่ตั้งใจไว้

5
วิธีอัปเดต LiveData ของ ViewModel จากบริการเบื้องหลังและอัปเดต UI
เมื่อเร็ว ๆ นี้ฉันกำลังสำรวจสถาปัตยกรรม Android ซึ่งได้รับการแนะนำโดย Google เมื่อเร็ว ๆ นี้ จากเอกสารฉันพบสิ่งนี้: public class MyViewModel extends ViewModel { private MutableLiveData<List<User>> users; public LiveData<List<User>> getUsers() { if (users == null) { users = new MutableLiveData<List<Users>>(); loadUsers(); } return users; } private void loadUsers() { // do async operation to fetch users } } …

3
เหตุใดจึงมีคลาสย่อย MutableLiveData ของ LiveData แยกต่างหาก
ดูเหมือนว่าจะMutableLiveDataแตกต่างจากLiveDataการทำให้setValue()และpostValue()วิธีการสาธารณะเท่านั้นในขณะที่LiveDataพวกเขาได้รับการคุ้มครอง มีเหตุผลอะไรบ้างในการสร้างคลาสแยกต่างหากสำหรับการเปลี่ยนแปลงนี้และไม่เพียงกำหนดวิธีการเหล่านั้นให้เป็นแบบสาธารณะในLiveDataตัวเอง โดยทั่วไปแล้วรูปแบบของการสืบทอด (การเพิ่มการมองเห็นของวิธีการบางอย่างเป็นการเปลี่ยนแปลงเพียงอย่างเดียว) การปฏิบัติที่รู้จักกันดีและมีสถานการณ์ใดบ้างที่อาจเป็นประโยชน์ (สมมติว่าเราสามารถเข้าถึงรหัสทั้งหมดได้)

4
การสังเกต LiveData จาก ViewModel
ฉันมีคลาสแยกต่างหากที่ฉันจัดการการดึงข้อมูล (โดยเฉพาะ Firebase) และฉันมักจะส่งคืนออบเจ็กต์ LiveData จากมันและอัปเดตแบบอะซิงโครนัส ตอนนี้ฉันต้องการเก็บข้อมูลที่ส่งคืนไว้ใน ViewModel แต่ปัญหาคือเพื่อให้ได้ค่าดังกล่าวฉันต้องสังเกตวัตถุ LiveData ที่ส่งคืนจากคลาสการดึงข้อมูลของฉัน วิธีการสังเกตการณ์ต้องการวัตถุ LifecycleOwner เป็นพารามิเตอร์แรก แต่เห็นได้ชัดว่าฉันไม่มีสิ่งนั้นอยู่ใน ViewModel ของฉันและฉันรู้ว่าฉันไม่ควรเก็บการอ้างอิงถึง Activity / Fragment ภายใน ViewModel ฉันควรทำอย่างไรดี?

6
ห้อง Android: แทรกเอนทิตีความสัมพันธ์โดยใช้ห้อง
ฉันได้เพิ่มอีกหนึ่งความสัมพันธ์จำนวนมากในห้องพักโดยใช้ความสัมพันธ์ ฉันอ้างถึงโพสต์นี้เพื่อเขียนโค้ดต่อไปนี้สำหรับความสัมพันธ์ในห้อง โพสต์จะบอกวิธีอ่านค่าจากฐานข้อมูล แต่การจัดเก็บเอนทิตีลงในฐานข้อมูลทำให้userIdว่างซึ่งหมายความว่าไม่มีความสัมพันธ์ระหว่าง 2 ตาราง ฉันไม่แน่ใจว่าอะไรคือวิธีที่ดีที่สุดในinsertการเข้าUserและList of Petเข้าสู่ฐานข้อมูลในขณะที่มีuserIdค่า 1) เอนทิตีผู้ใช้: @Entity public class User { @PrimaryKey public int id; // User id } 2) หน่วยงานสัตว์เลี้ยง: @Entity public class Pet { @PrimaryKey public int id; // Pet id public int userId; // User id public String name; } 3) UserWithPets …

2
<androidx.fragment.app.FragmentContainerView> vs <fragment> เป็นมุมมองสำหรับ NavHost
เมื่อใช้androidx.fragment.app.FragmentContainerViewเป็น navHost แทนfragmentแอปทั่วไปจะไม่สามารถนำทางไปยังปลายทางหลังจากเปลี่ยนทิศทางแล้ว ฉันได้รับข้อผิดพลาดต่อไปนี้: java.lang.IllegalStateException: no current navigation node มี gotcha ที่ฉันควรรู้เกี่ยวกับการใช้อย่างถูกต้องหรือวิธีการใช้ส่วนประกอบ nav ไม่ถูกต้องหรือไม่? กิจกรรม xml อย่างง่ายพร้อมมุมมอง: ... &lt;androidx.fragment.app.FragmentContainerView android:id="@+id/nav_host_fragment" android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_parent" android:layout_height="match_parent" app:defaultNavHost="true" app:layout_behavior="@string/appbar_scrolling_view_behavior" app:navGraph="@navigation/nav_simple" /&gt; ... รหัสนำทาง: &lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;navigation 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:id="@+id/nav_legislator.xml" app:startDestination="@id/initialFragment"&gt; &lt;fragment android:id="@+id/initialFragment" android:name="com.example.fragmenttag.InitialFragment" android:label="Initial Fragment" tools:layout="@layout/initial_fragment"&gt; &lt;action android:id="@+id/action_initialFragment_to_destinationFragment" app:destination="@id/destinationFragment" /&gt; &lt;/fragment&gt; &lt;fragment …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.