Articles of android architecture components

具有Android Room的可重用通用基类DAO

有没有办法用Android Room创建可重用的通用基类DAO? public interface BaseDao { @Insert void insert(T object); @Update void update(T object); @Query(“SELECT * FROM #{T} WHERE id = :id”) void findAll(int id); @Delete void delete(T object); } public interface FooDao extends BaseDao { … } public interface BarDao extends BaseDao { … } 我无法find实现这一目标的任何方法,而无需声明相同的接口成员并为每个子类编写查询。 在处理大量类似的DAO时,这变得非常乏味……

将LiveData与数据绑定结合使用

随着Android体系结构组件的稳定,我开始将所有基本的ViewModel更新为ViewModel的新实现。 根据我的理解,建议使用LiveData来保存Model类,因为它可以更好地处理生命周期。 我喜欢使用Data Binding因为它使代码在Java / Kotlin方面更加清晰,并且不需要“观察”值更改来更新UI。 但是,如果Model (或ViewModel)扩展BaseObservable而LiveData不扩展,则使用Data Binding的布局仅监视数据更改。 我理解LiveData的主要目标之一LiveData编程方式观察和更新UI,但对于简单的更新, Data Binding非常有用。 这个问题已经报道过( GitHub和Stack Overflow ),并且首先说版本1.0会有它,现在据说这个function正在开发中。 为了同时使用LiveData和Data Binding ,我创建了一个非常简单的类实现,它扩展了BaseObservable : import android.arch.lifecycle.LiveData import android.arch.lifecycle.MutableLiveData import android.databinding.BaseObservable class ObservableMutableLiveData() : BaseObservable() { private var data: MutableLiveData = MutableLiveData() constructor(data: T) : this() { this.data.value = data } public fun set(value: T) { if (value != data.value) […]

了解Android架构组件示例GithubBrowserSample:ViewModelModule,ViewModel参数

涵盖Android架构组件的最新样本之一是Google提供的GithubBrowserSample 。 我查看了代码并出现了一些问题: 我注意到ViewModelModule包含在AppModule中 。 这意味着所有视图模型都被添加到DI图中。 为什么以这种方式完成,而不是为每个Activity / Fragment提供单独的Module ,只为特定的Activity / Fragment提供所需的ViewModel ? 在这个具体的例子中,使用GithubViewModelFactory实例化视图模型有没有办法将parameter passing给特定的ViewModel ? 或者更好的解决方案是在ViewModel创建一个setter并通过setter设置所需的param?

无法在AppCompatActivity上解析符号ViewModelProviders

嘿我想让我的ViewModel工作,但到目前为止没有运气。 Android Studio显示错误Cannot resolve symbol ‘ViewModelProviders’ 。 我在这个主题上发现的每一个问题都是纠正extends Activity以extends AppCompatActivity ,但我正在扩展正确的问题。 不确定我错过了什么…… 我的代码基于此YouTubevideo 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 = ViewModelProviders.of(this).get(BaseViewModel.class); BaseViewModel.java public class BaseViewModel extends ViewModel { private Movie[] mMovie; […]

Android Jetpack导航,使用Youtube或Instagram的BottomNavigationView,如正确的后退导航(片段后退堆栈)?

Android Jetpack导航,BottomNavigationView在后退按钮上点击自动片段后栈? 我想要的是,在用户一个接一个地选择多个标签后,用户点击后退按钮应用必须重定向到他/她打开的最后一页。 通过将当前选定的项目保存在ArrayList中,我使用Android ViewPager实现了相同的function。 Android Jetpack导航发布后是否有任何自动后退堆栈? 我想用导航图实现它 activity_main.xml中 navigation.xml 还补充道 bottomNavigation.setupWithNavController(Navigation.findNavController(this, R.id.my_nav_host_fragment)) 我从Levi Moreira那里得到了一个答案如下 navigation.setOnNavigationItemSelectedListener {item -> onNavDestinationSelected(item, Navigation.findNavController(this, R.id.my_nav_host_fragment)) } 但通过这样做只发生了最后打开的片段的实例再次创建。 为BottomNavigationView提供适当的后退导航

如何清除LiveData存储值?

根据LiveData文档 : LiveData类具有以下优点: … 始终是最新数据:如果生命周期再次启动(如从后端堆栈返回到启动状态的活动),它将收到最新的位置数据(如果尚未生成)。 但有时候我不需要这个function。 例如,我在ViewModel中跟随LiveData,在Activity中跟踪Observer: //LiveData val showDialogLiveData = MutableLiveData() //Activity viewModel.showMessageLiveData.observe(this, android.arch.lifecycle.Observer { message -> AlertDialog.Builder(this) .setMessage(message) .setPositiveButton(“OK”) { _, _ -> } .show() }) 现在每次旋转后都会出现旧的对话框。 有没有办法在处理后清除存储的值或者根本没有使用LiveData?

房间试图重新打开已经关闭的数据库

使用Android架构组件中的Room时,在尝试使用Dagger组件访问数据库时收到以下错误: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: (database path) 我使用Dagger版本2.11和Room版本1.0.0-alpha7 。 该错误在版本1.0.0-alpha5上可重现。 初始化数据库并将其注入我的类后,任何尝试通过DAO访问数据库时都会发生此错误。

如何在扩展LifecycleActivity的视图中设置SupportActionBar

我有一个扩展AppCompactActivity的Activity,在onCreate方法中,我以通常的方式使用setSupportActionBar方法设置Toolbar : public class StepMasterActivity extends AppCompatActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_step_master); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar);` } } 但是现在我有一个ViewModel组件,并在作为此活动的子代的片段之间共享数据并管理生命周期,我必须在Activity中获取此组件,因此我将此扩展到LifecycleActivity。 public class StepMasterActivity extends LifecycleActivity { @Override public class StepMasterActivity extends LifecycleActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_step_master); // setToolbar(); SharedViewModel sharedViewModel = ViewModelProviders.of(this).get(SharedViewModel.class); } } 但我注意到LifecycleActivity与AppCompatActivity无关,而FragmentActivity也没有。 public […]

Android会议室:订单不工作

我正在使用新的Android ORM Room。 我遇到了问题。 带参数的ORDER BY不起作用。 如果我想使用ORDER BY参数中的字段,则无效。 没有任何吸引力。 @Query(“SELECT * FROM User ORDER BY :orderBY ASC”) List sortedFind(String orderBY); 但是,当我直接将哪个字段排序然后它按预期工作。 @Query(“SELECT * FROM User ORDER BY name ASC”) List sortedFind(); 它是android Room上的bug,还是我做错了什么?

导航架构组件 – 具有CollapsingToolbar的详细信息视图

新导航组件的拟议实践在I / O中提供,具有以下模板和建议的理念: 应用程序的一个活动 活动包含工具栏和底部导航栏 典型的应用程序通常具有详细视图,其中包含CollapsingToolbar。 如何在该架构下构建它? 将工具栏移动到每个片段XML? 以编程方式实现折叠工具栏? 将细节片段移动到它自己的活动(它可能会使用它自己的深层链接)并“打破”这个哲学?