说我有 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
我试图实现分页,但每次我旋转视图模型的屏幕构造函数时都会被调用,从而触发 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
我使用 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
我的活动中有三个顶级目标片段:
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
我已经阅读了几篇文章和文档以及SO问题,以了解minSDK与targetSDK和compileSDK之间的区别.
例如,在Medium上:选择compileSdkVersion,minSdkVersion和targetSdkVersion
这基本上总结了一下
minSdkVersion <= targetSdkVersion <= compileSdkVersion
但是仍然想了解如果我设置TargetSDK = 22但Compile SDK = 26有什么优缺点?
需要考虑的要点是 -
android android-support-library android-min-sdk runtime-permissions android-architecture-components
我实现了扩展ItemKeyedDataSource并提供来自会议室数据库的数据访问对象(DAO)的分页数据的类。我的DAO的查询方法将数据对象列表(不被包裹LiveData)传递给DataSource回调。
DataSource在包装的数据库表中发生更改后,例如,如果更改来自后台服务,则建议的无效方法是什么?如何在DataSource.Factory<Integer, T>DAO可以生成的返回参数中实现自动数据无效?
我正在尝试在应用程序中实现架构组件,但我在创建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
我正在尝试使用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) 我想将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
我正在尝试在我的内部使用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
android ×10
android-architecture-components ×10
kotlin ×2
android-architecture-navigation ×1
android-mvvm ×1
dagger-2 ×1
gradle ×1
java ×1
mvvm ×1
viewmodel ×1