1

在实现架构组件时,我面临这个问题

import android.arch.lifecycle.Lifecycle
import android.arch.lifecycle.LifecycleOwner
import android.os.Bundle
import com.reversebits.trendyvidz.R

class MainActivity : LifecycleOwner {

    override fun getLifecycle(): Lifecycle {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    fun onCreate(savedInstanceState: Bundle?) {
        setTheme(R.style.AppTheme) //This shows error
        setContentView(R.layout.activity_main) //This shows error
        init()
    }

    private fun init() {
        when {
            isNetworkAvailable() -> toast("Yes Avail")
            else -> toast("No") 
        }
    }
}

我如何想在这里获得像setContentView()AppCompatActivity 这样的基于 Activity 上下文的方法?

4

2 回答 2

3

正如已经指出的,如果你想创建一个 Activity,你需要扩展 Activity。


除此之外,您的代码中还有几个问题:

1)

如果您使用支持库 26.1.0+ 和生命周期 1.0.0-alpha9-1+ 生命周期已经包括在内,因为

AppCompatActivity extends FragmentActivity 
FragmentActivity extends SupportActivity 
SupportActivity extends Activity implements LifecycleOwner

2)

如果您使用较旧的支持库或生命周期,您有两种选择。

2a)

如果您的活动扩展了FragmentActivity,您将改为扩展LifecycleActivity,仅此而已。

2b)

如果你不能这样做,你会实现LifecycleRegistryOwner,例如:

class MyActivity extends AppCompatActivity implements LifecycleRegistryOwner {
    private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);

    @Override
    public LifecycleRegistryOwner getLifecycle() {
        return mLifecycleRegistry;
    }
}

这就是示例代码结束的地方,但我没有看到任何实际调度事件的代码。在调查当前SupportActivity事实证明它ReportFragment用于调度所有事件。添加这个以正确调度事件:

protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ReportFragment.injectIfNeededIn(this);
}

@CallSuper
protected void onSaveInstanceState(Bundle outState) {
    this.mLifecycleRegistry.markState(State.CREATED);
    super.onSaveInstanceState(outState);
}

另一件事,这是一个错误:

@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun onCreate(savedInstanceState: Bundle?) {

该方法onCreate触发ON_CREATE事件。不是反过来。你会得到这样的堆栈溢出错误。

您在方法上使用@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)注释,您希望在onCreate调用后自动触发,而不是在onCreate方法本身上。

于 2017-10-20T10:33:44.647 回答
-1

好的,我想通了,
我只需要这样做:

class MainActivity : AppCompatActivity(), LifecycleOwner {

因为 LifecycleOwner 只是一个具有单一方法的接口

override fun getLifecycle(): Lifecycle {
        TODO("Not implemented") //To change body of created functions use File | Settings | File Templates.
    }

在实现 LifecycleOwner 之后,我可以使用此注释对方法进行注释。

@OnLifecycleEvent(Lifecycle.Event.ON_START) etc.
于 2017-09-19T11:10:51.720 回答