web-dev-qa-db-ja.com

AppCompatActivityはLifecycleOwnerを実装していません

私はAndroid Support Library 26.1.0を使用しています。これらはアプリモジュールの依存関係です-

implementation "Android.Arch.lifecycle:runtime:1.0.0"
implementation "Android.Arch.lifecycle:extensions:1.0.0-beta1"
implementation "Android.Arch.persistence.room:rxjava2:1.0.0-beta1"
implementation "Android.Arch.lifecycle:common-Java8:1.0.0-beta1"
annotationProcessor "Android.Arch.lifecycle:compiler:1.0.0-beta1"

しかし、次のようにViewModelを使用しようとすると-

mUserViewModel.getUsers().observe(this,
            (Observer<Resource<List<UserView>>>) listResource -> {
                if(listResource != null){
                    this.handleDataState(listResource.status, listResource.data, listResource.message);
                }
            });

thisでエラーを表示しており、エラーメッセージはWrong first argument type Found: packagename.BrowseActivity, required: Android.Arch.lifecycle.LifecycleOwner。 (サポートライブラリのバージョンは26.1以降ですが、すでにLifecycleOwnerを実装しています)

私はこれで見つけたLifecycleRegistryOwnerも実装しようとしました sample 、これも機能していません。解決策を提案し、何か間違ったことをしているかどうかを教えてください。

Edit 1-これはアクティビティクラスです

import Android.Arch.lifecycle.Observer;
import Android.Arch.lifecycle.ViewModelProviders;
import Android.os.Bundle;
import Android.support.v7.app.AppCompatActivity;
import Android.support.v7.widget.LinearLayoutManager;
import Android.support.v7.widget.RecyclerView;
import Android.view.View;
import Android.widget.ProgressBar;

import com.github.amitkma.boilerplate.app.R;
import com.github.amitkma.boilerplate.app.mapper.UserMapper;
import com.github.amitkma.boilerplate.app.model.UserModel;
import com.github.amitkma.boilerplate.app.ui.widget.EmptyView;
import com.github.amitkma.boilerplate.app.ui.widget.ErrorView;
import com.github.amitkma.boilerplate.presentation.data.Resource;
import com.github.amitkma.boilerplate.presentation.data.ResourceState;
import com.github.amitkma.boilerplate.presentation.factory.ViewModelFactory;
import com.github.amitkma.boilerplate.presentation.viewmodel.UserViewModel;
import com.github.amitkma.boilerplate.presentation.vo.UserView;

import Java.util.ArrayList;
import Java.util.List;

import javax.inject.Inject;

import dagger.Android.AndroidInjection;

public class BrowseActivity extends AppCompatActivity {

    @Inject
    UserAdapter mUserAdapter;
    @Inject
    UserMapper mUserMapper;
    @Inject
    ViewModelFactory mViewModelFactory;
    private UserViewModel mUserViewModel;

    private RecyclerView mRecyclerView;
    private ProgressBar mProgressBar;
    private ErrorView mErrorView;
    private EmptyView mEmptyView;


   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       AndroidInjection.inject(this);
       setContentView(R.layout.activity_browse);
       mUserViewModel = ViewModelProviders.of(this, mViewModelFactory)
            .get(UserViewModel.class);

       mRecyclerView = findViewById(R.id.recycler_browse);
       mProgressBar = findViewById(R.id.progress);
       mEmptyView = findViewById(R.id.view_empty);
       mErrorView = findViewById(R.id.view_error);

       setupBrowseRecycler();
       setupViewListeners();
   }

    @Override
    protected void onStart() {
        super.onStart();
        mUserViewModel.getUsers().observe(this,
            (Observer<Resource<List<UserView>>>) listResource -> {
                if(listResource != null){
                    this.handleDataState(listResource.status, listResource.data, listResource.message);
                }
            });
    }
    ....
}

これはViewModelクラスです

import Android.Arch.lifecycle.LiveData;
import Android.Arch.lifecycle.MutableLiveData;
import Android.Arch.lifecycle.ViewModel;

import com.github.amitkma.boilerplate.domain.interactor.GetUserList;
import com.github.amitkma.boilerplate.domain.model.User;
import com.github.amitkma.boilerplate.presentation.data.Resource;
import com.github.amitkma.boilerplate.presentation.data.ResourceState;
import com.github.amitkma.boilerplate.presentation.mapper.UserMapper;
import com.github.amitkma.boilerplate.presentation.vo.UserView;

import Java.util.ArrayList;
import Java.util.List;

import javax.inject.Inject;

import io.reactivex.subscribers.DisposableSubscriber;

public class UserViewModel extends ViewModel {

    private final GetUserList mGetUserList;
    private final UserMapper mUserMapper;

    @Inject
    public UserViewModel(GetUserList getUserList,
            UserMapper userMapper) {
        mGetUserList = getUserList;
        mUserMapper = userMapper;
        fetchUsers();
    }

    public void fetchUsers(){
        mUserMutableLiveData.postValue(new Resource(ResourceState.LOADING, null, null));
        mGetUserList.execute(new UserSubscriber(), null);
    }

    public LiveData<Resource<List<UserView>>> getUsers(){
        return mUserMutableLiveData;
    }

    @Override
    protected void onCleared() {
        mGetUserList.dispose();
        super.onCleared();
    }

    private final MutableLiveData<Resource<List<UserView>>> mUserMutableLiveData =
        new MutableLiveData<>();

}

13
Amit Kumar

ここでも同じ問題があるため、次のようにandroidx.appcompat依存関係を更新する必要がありました。

implementation 'androidx.appcompat:appcompat:1.1.0-alpha04'
17

これをもう実装する必要はありません。

LifecycleOwnerを拡張するAppCompatActivityによってアクティビティを拡張するだけです。

このインターフェイスは、APIレベル1.0.0で廃止されました。 LifecycleOwnerを拡張するAndroid.support.v7.app.AppCompatActivityを使用します。したがって、このクラスにはユースケースはありません。

オーバーライドするのを忘れた

private final LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this);

@Override
public LifecycleRegistry getLifecycle() {
    return lifecycleRegistry;
}

少なくともSupport-Libが必要です 26.1

フラグメントについても同じです。 LifecycleFragmentでフラグメントを拡張するだけで、Android.support.v4.app.Fragment

編集:Kotlinを使用して簡単なサンプルプロジェクトを再構築するだけで機能しました。

class MainActivity : AppCompatActivity(), HasSupportFragmentInjector, AnkoLogger {
    private val lifecycleRegistry by lazy { Android.Arch.lifecycle.LifecycleRegistry(this) }
    private val viewModel by lazy { ViewModelProviders.of(this, viewModelFactory).get(BridgesVm::class.Java) }
    override fun getLifecycle() = lifecycleRegistry

    public override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewModel.data.observe(this, Observer<Bridge?> { info { "Received" } })
   }
}

class BridgesVm @Inject constructor() : ViewModel() { 
        val data: LiveData<Bridge> = MutableLiveData<Bridge>()
}

編集:

Archバージョンbeta1の使用に問題があります。これが修正されるまで、1.0.0-alpha9-1の使用を検討してください。私の場合、beta1を使用しているがalpha 9-1で作業している場合は機能しませんでした

8
Emanuel S

Android jetpack、それはあなたの問題を解決します

implementation 'androidx.appcompat:appcompat:1.1.0-rc01'

6