标签: android-architecture-components

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

我有一个扩展AppCompactActivity的Activity,在onCreate方法中我以通常的方式设置了Toolbarusing setSupportActionBar方法:

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);`
    }
}
Run Code Online (Sandbox Code Playgroud)

但是现在我有一个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);
    }
}
Run Code Online (Sandbox Code Playgroud)

但我注意到LifecycleActivity与AppCompatActivity无关,而FragmentActivity也没有.

public class LifecycleActivity extends FragmentActivity implements LifecycleRegistryOwner {
    private final LifecycleRegistry mRegistry = new LifecycleRegistry(this);

    public LifecycleActivity() {
    } …
Run Code Online (Sandbox Code Playgroud)

android activity-lifecycle android-activity android-architecture-lifecycle android-architecture-components

17
推荐指数
1
解决办法
2343
查看次数

Room - LiveData观察器在数据库更新时不会触发

我试图在下面的代码中找到,为什么一旦我用新数据填充数据库,Room的LiveData observable就不会给我新的转变.

这是我的活动的onCreate方法:

shiftsViewModel = ViewModelProviders.of(this).get(ShiftsViewModel.class);
shiftsViewModel
            .getShifts()
            .observe(this, this::populateAdapter);
Run Code Online (Sandbox Code Playgroud)

这是populateAdapter方法:

private void populateAdapter(@NonNull final List<Shift> shifts){

    recyclerView.setAdapter(new SimpleItemRecyclerViewAdapter(shifts));
}
Run Code Online (Sandbox Code Playgroud)

我还有以下代码填充数据库(我使用RxJava在IO线程上完成工作,因为Room需要在主线程之外调用它的代码):

@Override
public Observable<List<Shift>> persistShifts(@NonNull final List<Shift> shifts){

    return Observable.fromCallable(() -> {

        appDatabase.getShiftDao().insertAll(shifts);
        return shifts;
    })
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread());
}
Run Code Online (Sandbox Code Playgroud)

在我开始观察我的shiftViewModel之后调用persistShifts时出现的问题.我希望我的观察者(LiveData)会被所有新添加的班次触发.事实证明,观察者被触发了,但是返回了一个空的移位列表.使其"工作"的唯一方法是,如果我离开活动(因此销毁当前的ViewModel)并再次输入.这次viewModel的LiveData为我提供了之前保持的所有变化,正如预期的那样.

这是代码的其余部分:

@Entity
public class Shift{

   @PrimaryKey
   private long id;

   private String start;
   private String end;
   private String startLatitude;
   private String startLongitude;
   private String endLatitude;
   private String endLongitude;
   private String image;
   ...
Run Code Online (Sandbox Code Playgroud)

DAO:

@Dao
public interface ShiftDAO {

   @Query("SELECT * FROM …
Run Code Online (Sandbox Code Playgroud)

android viewmodel android-room android-livedata android-architecture-components

17
推荐指数
1
解决办法
7087
查看次数

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

涵盖Android架构组件的最新样本之一是Google提供的GithubBrowserSample.我查看了代码并出现了一些问题:

  1. 我注意到ViewModelModule包含在AppModule中.这意味着所有视图模型都被添加到DI图中.为什么以这种方式完成而不是Module为每个只提供ViewModel特定活动/片段所需的活动/片段分开?

  2. 在这个具体的例子中,使用GithubViewModelFactory实例化视图模型有没有办法将参数传递给特定的ViewModel?或者更好的解决方案是创建一个setter ViewModel并通过setter设置所需的param?

android dagger dagger-2 android-viewmodel android-architecture-components

17
推荐指数
1
解决办法
1916
查看次数

具有干净架构的Android分页库

我正在尝试Android架构组件中的分页库,但我怀疑将它集成到基于干净架构的项目中.

一般来说我有3个模块:

  • 主模块(App)
  • 数据模块(具有网络和数据库依赖关系的Android模块)
  • 域模块(Pure Kotlin模块)

为了引入分页,我不得不将PagedList<T>类视为域类.(IMO不是一个可怕的想法,因为最终是一个列表,数据源是抽象的)

所以在域层我可以有一个像以下的repostiory:

interface ItemRepository {
    fun getItems():PagedList<Item>
}
Run Code Online (Sandbox Code Playgroud)

然后在数据模块中创建如下的实现:

class ItemRepositoryImpl: ItemRepositoy(private val factory:ItemDataSourceFavtory) {
    fun getItems():PagedList<Item> {

  val pageConfigurations = PagedList.Config.Builder()
            .setPageSize(10)
            .setInitialLoadSizeHint(15)
            .setPrefetchDistance(5)
            .setEnablePlaceholders(false)
            .build()

    return RxPagedListBuilder(locationDataSourceFactory, pageConfigurations)
            .setInitialLoadKey(1)
            .buildObservable()
}
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.我的疑问是,当我们需要变换域模型为表示层(比方说我的项目需要意识到,如果被检查显示的图标检查),通常我会我的域模型映射到演示文稿一个.

我知道DataSourceFactoryhas mapmapByPage方法,但工厂驻留在数据层.我的Viewmodel使用来自模型层的数据,在这种情况下,这将是一个数据PagedList,据我所知,分页列表不支持映射.

那么在这种情况下适当的做法是什么呢?

android clean-architecture android-architecture-components android-jetpack android-paging

17
推荐指数
1
解决办法
1204
查看次数

我可以在导航组件中使用多个NavHostFragments吗?

如果您难以理解以下段落,请查看我制作的流程图.

我目前正在制作一个有3个顶级目的地的笔记应用程序.其中一个顶级目标(NotesList)显示用户创建的注释列表.NotesList有一个过滤器按钮,它会打开一个带有FilterMenu目标的底部模态表.FilterMenu有一个搜索按钮,点击后,用一个搜索目的地替换工作表的内容,一个名为tags的按钮,点击后,用一个包含与所有注释相关的标签列表的片段替换工作表的内容(TagList)目的地).

在此输入图像描述

蓝色的一切都是顶级目的地.紫色的所有东西都存在于模态表中.

FilterMenu,Search和TagList显示在模式表中.这意味着NotesList 包含这些片段,而不是由它们替换.它们存在于小于NotesList的屏幕区域中.如果我使用导航,片段将互相替换.

我可以使用两个NavHosts吗?一个用于顶级目的地,另一个用于模态表中的东西?如果是这样,我将如何实现它?如果没有,在这种情况下建议做什么?

android android-architecture-components android-architecture-navigation

17
推荐指数
1
解决办法
700
查看次数

发射和发射源与 LiveData 有什么区别?(如在实时用例中)

emit接受data类而emitSource接受LiveData<T>( T -> data)。考虑以下示例:-我有两种类型的调用:-

suspend fun getData(): Data // returns directly data
Run Code Online (Sandbox Code Playgroud)

而另一个;

suspend fun getData(): LiveData<Data> // returns live data instead
Run Code Online (Sandbox Code Playgroud)

对于第一种情况,我可以使用:-

liveData {
   emit(LOADING)
   emit(getData())
}
Run Code Online (Sandbox Code Playgroud)

我的问题:使用上述方法可以解决我的问题,为什么我们还需要emitSource(liveData)

任何使用该emitSource方法的好用例都会清楚地表明!

android android-livedata android-architecture-components android-jetpack kotlin-coroutines

17
推荐指数
4
解决办法
5963
查看次数

具有MVP的Android架构组件

谷歌IO 17上发布了新的Android架构组件.

那么我们应该将MVP与架构组件和MVVM一起使用吗?

在Github上的谷歌样本中,他们使用了MVVM模型. Google示例

android android-architecture-components

16
推荐指数
2
解决办法
4731
查看次数

导航架构组件 - 使用lambda表达式的操作导航

我添加了一个新动作Navigation.xml:

 <fragment
    android:id="@+id/launcher_home"
    android:name="com.example.android.codelabs.navigation.MainFragment"
    android:label="@string/home"
    tools:layout="@layout/main_fragment">
    <action
        android:id="@+id/go_to_step_one"
        app:destination="@id/flow_step_one" />
</fragment>
Run Code Online (Sandbox Code Playgroud)

调用导航操作时,如果我使用,导航工作正常:

 view.findViewById<Button>(R.id.navigate_action_bt)?.setOnClickListener(
            Navigation.createNavigateOnClickListener(R.id.go_to_step_one, null)
    )
Run Code Online (Sandbox Code Playgroud)

但是当用lambda调用它时,它不起作用:

 view.findViewById<Button>(R.id.navigate_action_bt)?.setOnClickListener {
        Navigation.createNavigateOnClickListener(R.id.go_to_step_one, null)
    }
Run Code Online (Sandbox Code Playgroud)

android kotlin android-architecture-components android-jetpack android-architecture-navigation

16
推荐指数
1
解决办法
2173
查看次数

每个实体的Android MVVM ViewModel和Repositories?

使用Android架构组件和MVVM模式,我有一些问题.

基于Web上的大多数示例,通常有简单的示例.

  1. 有一个房间实体 @Entity public class User{ ... }

  2. 有一个DAO @Dao public interface UserDao{ ... }

  3. 有一个存储库 public class UserRepository{ }

  4. 视图模型 public class UsersListViewModel extends AndroidViewModel{ .... }

现在让我们来扩展这个和旁边useruser_accessuser_actions举例来说,这么有3个表.

问题:

  1. 对于房间I中的每个表,创建实体.我应该Dao为每个实体(userDao,userAccessDao,userActionsDao)或一般AppDao类提供3个吗?

  2. 同样适用于Repository.每个Entitiy的整个应用程序或存储库的一个存储库(RepositoryUser,RepositoryUserAccess,RepositoryUserActions?

  3. 如果我的应用程序有一个主要活动和多个片段,我应该为每个片段创建一个ViewModel吗?

android mvvm android-architecture-components android-jetpack

16
推荐指数
1
解决办法
2687
查看次数

备份室数据库

我正在尝试以编程方式备份​​房间数据库.

为此,我只是复制.sqlite包含整个数据库的文件

但是,在复制之前,由于房间已启用提前写入日志,我们必须关闭数据库,以便将-shm文件和-wal文件合并为单个.sqlite文件.正如这里指出的那样

.close()RoomDatabase对象上运行:

一切正常,备份,但是,稍后,当我尝试执行INSERT查询时,我收到此错误:

android.database.sqlite.SQLiteException: no such table: room_table_modification_log (code 1)
Run Code Online (Sandbox Code Playgroud)

关闭后如何才能正确地重新打开房间数据库?

PS:.isOpen()RoomDatabase对象返回trueINSERT

房间版: 1.1.1-rc1

sqlite android sqliteopenhelper android-room android-architecture-components

16
推荐指数
3
解决办法
4766
查看次数