标签: android-architecture-components

我可以使用 safeargs 将可为空的数据类型作为参数发送吗?如果不是我该怎么办?

说我有 2 个片段。登录和主页。我将 Home 片段设置为以 userData 作为参数的全局目的地

在此处输入图片说明

如果用户还没有登录,那么它将从登录片段开始。登录并从服务器获取 userData 后,它将导航到 Home 并使用此代码传递 userData

 val home = AuthenticationFragmentDirections.actionGlobalHomeFragment(userData)
 Navigation.findNavController(view).navigate(home, navOptions)
Run Code Online (Sandbox Code Playgroud)

但问题是当用户已经登录并打开应用程序时。在这种情况下,他们将直接打开主页片段。我的应用程序因错误而崩溃

java.lang.IllegalArgumentException:缺少必需的参数“userData”并且没有 android:defaultValue

所以我假设我可以在像User? 这样的参数中设置可为空的数据类型,所以如果 Home 片段不是来自 Login 则不需要 userData

这里阅读后,我设置了这样的论点来实现User?

<argument
    android:name="userData"
    android:defaultValue="@null"
    app:argType="User"
    app:nullable="true" />
Run Code Online (Sandbox Code Playgroud)

但问题是,当我将用户数据从登录片段发送到家时,它说我有太多参数

我在gradle中使用这个

implementation "androidx.navigation:navigation-fragment-ktx:2.3.0-alpha04"
    implementation "androidx.navigation:navigation-ui-ktx:2.3.0-alpha04"
Run Code Online (Sandbox Code Playgroud)

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

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

为什么 ViewModelProvider 在屏幕旋转时创建视图模型的新实例?

我试图实现分页,但每次我旋转视图模型的屏幕构造函数时都会被调用,从而触发 loadInitial 从我的 DataSource 类中的网络获取新数据。感谢帮助

// ViewModel
def lifecycle_version = "2.2.0"
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
// LiveData
implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"
Run Code Online (Sandbox Code Playgroud)

在我的活动 oncreate 中:

TopRatedResultViewModel viewModel =   ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication()).create(TopRatedResultViewModel.class);
Run Code Online (Sandbox Code Playgroud)

查看型号:

public class TopRatedResultViewModel extends AndroidViewModel {
private Top_Rated_Results_Repository repository;

public TopRatedResultViewModel(@NonNull Application application) {
    super(application);
    Log.d("moviedatabaselog", "TopRatedResultViewModel ");
    repository = new Top_Rated_Results_Repository(application);

}

public LiveData<PagedList<Top_Rated_Result>> getTopRatedResultsPagedList() {
    return repository.getTopRatedResultsPagedList();
}
Run Code Online (Sandbox Code Playgroud)

我正在关注本教程Android 分页与改造, 但这里使用了不推荐使用的 ViewModelProviders.of 并且当我在屏幕旋转构造函数没有被调用后测试它时。

android android-mvvm android-livedata android-architecture-components

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

使用 Dagger 2 将应用程序上下文注入存储库

我使用 Dagger 2.17 获取存储库中的应用程序上下文来访问资源:

ContextInjection.kt:

@Module
class ContextModule(private val context: Context) {

    @Singleton
    @Provides
    fun providesContext(): Context {
        return context
    }
}

@Singleton
@Component(modules = [ContextModule::class])
interface ContextComponent {
    fun inject(): Context
}
Run Code Online (Sandbox Code Playgroud)

初始化.kt:

class Initialization : Application() {

    override fun onCreate() {
        super.onCreate()

        contextComponent = DaggerContextComponent.builder()
            .contextModule(ContextModule(this.applicationContext))
            .build()
    }

    companion object { // for access in repository
        lateinit var contextComponent: ContextComponent
    }
}
Run Code Online (Sandbox Code Playgroud)

存储库.kt:

@Singleton
class Repository {

    @Inject
    lateinit var context: Context

    /** the method is invoked from …
Run Code Online (Sandbox Code Playgroud)

android dependency-injection repository-pattern dagger-2 android-architecture-components

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

导航组件,如何在导航抽屉中显示普通的向上/后退按钮而不是汉堡包图标

我的活动中有三个顶级目标片段:

appBarConfiguration = AppBarConfiguration(
        setOf(
            R.id.trackerFragment,
            R.id.nutrientFragment,
            R.id.settingsFragment
        ),
        drawerLayout
    )
Run Code Online (Sandbox Code Playgroud)

这意味着所有这些片段将显示汉堡按钮而不是正常的后退箭头。问题是我的应用程序中有一个“转到 Nutrient”按钮,可以导航到 NutrientFragment,这是顶级目的地。我希望这个片段在使用抽屉导航时仍然显示汉堡包图标,但在通过“转到营养物”按钮导航时显示正常的后退/向上按钮。

我最初的想法是在导航到 时传递一个布尔值作为参数NutrientFragment,并在内部onCreateView()根据布尔值,删除汉堡包图标或添加后退按钮。但这似乎有点丑陋且效率低下,特别是如果将来我添加更多可能存在相同问题的目的地。我也不知道如何“删除汉堡包图标并替换为正常的后退按钮”。关于如何实施有什么想法吗?我找到的所有答案要么是旧的已弃用的java代码,要么不完全是我正在寻找的。

谢谢。

android kotlin navigation-drawer android-navigation android-architecture-components

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

设置TargetSDK = 22但编译SDK = 26的优缺点是什么?

我已经阅读了几篇文章和文档以及SO问题,以了解minSDK与targetSDK和compileSDK之间的区别.

例如,在Medium上:选择compileSdkVersion,minSdkVersion和targetSdkVersion

这基本上总结了一下

minSdkVersion <= targetSdkVersion <= compileSdkVersion

但是仍然想了解如果我设置TargetSDK = 22但Compile SDK = 26有什么优缺点?

需要考虑的要点是 -

  1. 我想使用RxJava 2,Dagger 2,随最新支持库提供的Android架构组件,带有Gradle 4.1的Android Studio 3.0等.
  2. 通过将Target SDK版本设置为22以下Android M,我想避免运行时权限对话框.
  3. 应该可以在以后迁移到Kotlin.
  4. minSDK版本将继续保持15

android android-support-library android-min-sdk runtime-permissions android-architecture-components

0
推荐指数
1
解决办法
553
查看次数

使用ItemKeyedDataSource观察Room Database表中的更改

我实现了扩展ItemKeyedDataSource并提供来自会议室数据库的数据访问对象(DAO)的分页数据的类。我的DAO的查询方法将数据对象列表(不被包裹LiveData)传递给DataSource回调。

DataSource在包装的数据库表中发生更改后,例如,如果更改来自后台服务,则建议的无效方法是什么?如何在DataSource.Factory<Integer, T>DAO可以生成的返回参数中实现自动数据无效?

android android-architecture-components

0
推荐指数
1
解决办法
1757
查看次数

无法创建AndroidViewModel的实例

我正在尝试在应用程序中实现架构组件,但我在创建androidViewModel实例时面临一个问题.请帮我解决这个问题.

这里我试图创建一个LoginViewModel类的实例,但得到下面提到的错误

错误

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.addonitservices.uphaar, PID: 22975
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.addonitservices.uphaar/com.addonitservices.uphaar.login.LoginActivity}: java.lang.RuntimeException: Cannot create an instance of class com.addonitservices.uphaar.login.LoginViewModel
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
     Caused by: java.lang.RuntimeException: Cannot create an instance of class com.addonitservices.uphaar.login.LoginViewModel
        at android.arch.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:201)
        at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:134)
        at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:102)
        at com.addonitservices.uphaar.login.LoginActivity.initViewModel(LoginActivity.kt:27)
        at com.addonitservices.uphaar.login.LoginActivity.onCreate(LoginActivity.kt:22)
        at android.app.Activity.performCreate(Activity.java:6999)
        at android.app.Activity.performCreate(Activity.java:6990)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) 
        at android.app.ActivityThread.-wrap11(Unknown Source:0) …
Run Code Online (Sandbox Code Playgroud)

android mvvm kotlin android-viewmodel android-architecture-components

0
推荐指数
1
解决办法
2012
查看次数

无效的参数类型。必须是LifecycleOwner的一个实例

我正在尝试使用lifeCycleOwner和lifecycleObserve。当我调用lifecycleOwner.getLifecycle()。addObserver(this)时,出现以下异常

invalid parameter type. Must be one and instanceof LifecycleOwner
Run Code Online (Sandbox Code Playgroud)

代码如下所示

public class TestActivity extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test_activity);

        new  TestObserver(this,this);
    }   
    }

public class TestObserver implements LifecycleObserver{

  public TestObserver(LifecycleOwner lifecycleOwner, Context context){
        lifecycleOwner.getLifecycle().addObserver(this);
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑: 根据要求Build.gradle文件

apply plugin: 'com.android.application'

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.example.test"
        minSdkVersion 14
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
    }


    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies …
Run Code Online (Sandbox Code Playgroud)

android android-architecture-components

0
推荐指数
1
解决办法
548
查看次数

当与DataBinding一起使用时,LiveData不会将更改通知给UI

我想将UI LiveData与DataBinding一起使用时进行更改。但是随着LiveData变化,它并不能反映UI的变化。

MainViewModel.java

public class MainViewModel extends AndroidViewModel {
    /**
     * Boolean variable to see whether user is ClockedIn or ClockedOut
     */
    public MutableLiveData<Boolean> isClockedIn;

    public MainViewModel(Application application) {
        super(application);
        isClockedIn = new MutableLiveData<>();
        //...
        calculateClockedInOrNot(PreferencesManager.getString(mContext,PreferencesManager.CLOCK_STATUS_KEY));
    }

    /**
     * An utility function to calculate whether user is clocked in or clocked out,
     * this function is also called within this ViewModel after an api hit
     *
     * if string == "CLOCKED_OUT" or string == "mobileEventType.CLOCK_OUT" => user …
Run Code Online (Sandbox Code Playgroud)

android android-studio android-databinding android-architecture-components

0
推荐指数
1
解决办法
1565
查看次数

AppCompatActivity未观察到ViewModel

我正在尝试在我的内部使用ViewModel,EarthquakeActivity但我一直收到此错误:

Wrong 1st argument type. Found: 'com.example.android.quakereport.EarthquakeActivity', required: 'androidx.lifecycle.LifecycleOwner'
Run Code Online (Sandbox Code Playgroud)

这是从我尝试做的时候开始的

mainViewModel.getEarthquakeData().observe(this, new Observer<List<Earthquake>>() {
        @Override
        public void onChanged(List<Earthquake> earthquakes) {
                // do something
        }
    });
Run Code Online (Sandbox Code Playgroud)

this这活动返回一个错误.

我读到这里AppCompatActivity已经延伸LifecycleOwner,这是我使用的是什么.这有什么不对?每个其他教程都没有这个问题.

我的EarthquakeActivity.java:

package com.example.android.quakereport;

import android.arch.lifecycle.ViewModelProviders;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;

import POJO.Earthquake;
import POJO.RootEarthquakeResponse;
import androidx.lifecycle.Observer;
import retrofit2.Call;


public class EarthquakeActivity extends AppCompatActivity {

    private RecyclerView recyclerView;
    private RecyclerView.Adapter adapter;
    private LinearLayoutManager  layoutManager;

    public …
Run Code Online (Sandbox Code Playgroud)

java android viewmodel gradle android-architecture-components

0
推荐指数
1
解决办法
640
查看次数