标签: android-architecture-components

具有MVP的Android架构组件

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

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

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

android android-architecture-components

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

如何填充房间库中实体的非列字段

我有一个类实体如下

@Entity
public class Task {    
    private String name; 
    private Integer ParentId;
    private Integer userId;   
    @Ignore
    private int noOfSubTask;
}
Run Code Online (Sandbox Code Playgroud)

在DAO类中有一个方法getTaskList()

@Dao
public interface TaskDao extends Dao<Task> {

@Query("SELECT *,(SELECT count(*) FROM Task b  WHERE a._id = b.ParentId ) AS noOfSubTask FROM Task a ")
LiveData<List<Task>> getTaskList();
}
Run Code Online (Sandbox Code Playgroud)

我想用noOfSubTask填充由(SELECT count(*)FROM Task b WHERE a._id = b.ParentId)部分查询给出的数字,但问题是它不是一列,所以房间库不会映射它getTaskList方法in dao实现(自动生成)类.

有没有办法用dao类房间库的任何方法来填充实体的非列字段(比如我的情况下的noOfSubTask)?

java sqlite android android-room android-architecture-components

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

备份室数据库

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

为此,我只是复制.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
查看次数

设备旋转后,NavController 没有当前导航节点

我正在制作支持不同设备方向的应用程序。导航由 Android Jetpack 的 Navigation 执行。横向应用程序主屏幕如下所示。它是列表包装片段(它是NavHostFragment,它被添加到fragment标签中的活动布局),包装包括列表片段(fragment)和详细信息片段(FrameLayout)。纵向方向是相似的(包装器和列表在其中,详细信息可访问抛出导航)。

应用主画面

我的问题是在更改设备方向后出现异常

java.lang.IllegalStateException: 没有当前导航节点

带有模拟数据的布局的第一个版本工作正常,在我将 ROOM 添加到我的应用程序、新订单和更新订单片段后出现错误。很遗憾,我无法更准确地定位错误源。

列出包装器代码

class OrderListWrapperFragment : RxFragment() {

    private val disposable = CompositeDisposable()

    var selectedOrderId: Long = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val bundle = savedInstanceState ?: arguments
        bundle?.let {
            selectedOrderId = it.getLong(EXTRA_ORDER_ID)
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? = inflater.inflate(R.layout.orders__list_wrapper, container, false)

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        initializeToolbar(toolbar, …
Run Code Online (Sandbox Code Playgroud)

android android-fragments kotlin android-architecture-components

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

如何将List <Object>转换为PagedList <Object>,反之亦然?

PagedList<Object>用于Android的酷分页库.要使问题尽可能小:如果我有一个字符串列表,如

  List<String> stringList; // it consists of 200 strings
Run Code Online (Sandbox Code Playgroud)

我想转换 stringListPagedList<String>类似的类型

  PagedList<String> pagedStringList;
Run Code Online (Sandbox Code Playgroud)

而且,如果我有一个PagedList<Object>如何将其转换为List<Object>?我经历了这个以供参考

如果我尝试相反的方式....

我怎么能转换List<Object>DataSource.Factory<Integer, Object>..所以间接我可以把它转换成PagedList<>

DataSource.Factory<Integer, Object>我可以转换为PagedList<>但我怎么能转换listPagedList<>

android rx-java2 android-livedata android-architecture-components android-jetpack

15
推荐指数
1
解决办法
4203
查看次数

IllegalStateException:链接没有NavController集

我正在使用Android导航组件进行导航.我有一个LoginFragment,它有一个按钮可以转换到SignUpFragment.单击按钮我收到此错误.

java.lang.IllegalStateException: View android.support.v7.widget.AppCompatButton{49d9bd1 VFED..C.. ...P.... 201,917-782,1061 #7f090172 app:id/signUpLink} does not have a NavController set
Run Code Online (Sandbox Code Playgroud)

这是我的nav_graph.xml

<navigation xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        app:startDestination="@id/loginFragment">
        <fragment
            android:id="@+id/loginFragment"
            android:name="org.fossasia.openevent.app.core.auth.login.LoginFragment"
            android:label="login_fragment"
            tools:layout="@layout/login_fragment">
            <action
                android:id="@+id/action_loginFragment_to_signUpFragment"
                app:destination="@id/signUpFragment" />

        </fragment>
    </navigation>
Run Code Online (Sandbox Code Playgroud)

以下是LoginFragment for Navigation中的代码 -

binding.signUpLink.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.action_loginFragment_to_signUpFragment, null));
Run Code Online (Sandbox Code Playgroud)

以下是NavHostFragment的活动布局文件的摘录 -

<FrameLayout
            android:id="@+id/fragment_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"
            android:name="android.navigation.fragment.NavHostFragment"
            app:navGraph="@navigation/main_navigation"
            app:defaultNavHost="true"/>
Run Code Online (Sandbox Code Playgroud)

android android-architecture-components android-architecture-navigation

15
推荐指数
11
解决办法
1万
查看次数

如何使用Navigation type safeargs插件将Parcelable类型的对象传递给Fragment

我正在重写我的简单UI应用程序以使用导航架构组件,我需要传递一个实现Parcelable的Pojo,没有看到任何关于如何做到这一点的文档.

任何帮助,将不胜感激.

android android-fragments android-architecture-components android-jetpack

15
推荐指数
4
解决办法
6314
查看次数

LiveData.无法分配给'value':setter受保护/*受保护,package*/用于合成扩展

我正在尝试使用Android文档中描述的LiveData实现DB Observer .

只要我在Kotlin编程,我就会调整函数(最初用Java编写).

在尝试保存数据时,我发现了这个问题.

Cannot assign to ‘value’: the setter is protected/*protected and package*/ for synthetic extension in ‘<library Grade: android.arch.livecycle:livedata-core-1.1.1>’
Run Code Online (Sandbox Code Playgroud)

有人有这个问题吗?

这是我的代码:

视图模型:

class ProfileViewModel: ViewModel() {

    object FirstName: MutableLiveData<String>()

    fun getCurrentName(): LiveData<String> {
        return FirstName
    }
}
Run Code Online (Sandbox Code Playgroud)

分段

class ProfileFragment{

    private lateinit var model: ProfileViewModel

    // this is called onViewCreated. inputFirstName is an Edittext.
    override fun setUp() {
        model = ViewModelProviders.of(this).get(ProfileViewModel::class.java)

        val nameObserver = Observer<String> { firstName ->
            inputFirstName.text = SpannableStringBuilder(firstName)
        }

        model.getCurrentName().observe(this, nameObserver)
    } …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-livedata android-architecture-components

15
推荐指数
1
解决办法
4402
查看次数

导航架构组件 - 如何刷新片段?

我有一个 ListFragment 有一个 recyclerview 和 onClick 任何项目打开 DetailsFragment。详细信息片段在底部包含另一个显示“更多项目”的回收站视图。现在 onClick 任何这些项目应该打开该特定项目的 DetailsFragment。基本上片段需要刷新。

过去,我只会使用 fragmentManager 替换 fragment。我如何去刷新片段?如何创建指向同一个片段的动作?

android android-fragments android-architecture-components android-jetpack android-architecture-navigation

15
推荐指数
1
解决办法
6238
查看次数

Android ViewModel 和 startActivity

我正在学习ViewModelLiveData并且在此过程中产生了疑问。

如果我需要启动一个,我应该怎么做Activity

是否可以将上下文作为参数传递给ViewModel(上下文不会存储在 ViewModel 中)?

ActivityAViewModel : ViewModel() {
    // ...

    fun openActivityB(context: Context) {
        context.startActivity(...)
    }

    // ...
}

ActivityA {
    // ...

    fun onSomethingHappened() {
        viewModel.openActivityB(this)
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

如果不是,在这种情况下最正确的做法是什么?

android viewmodel android-viewmodel android-architecture-components

15
推荐指数
3
解决办法
1万
查看次数