如何在继承LifecycleActivity的视图中设置支持ActionBar

17

我有一个扩展了AppCompactActivity的Activity,在onCreate方法中,我通常的方式使用setSupportActionBar 方法来设置 Toolbar

public class StepMasterActivity extends AppCompatActivity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_step_master);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);`
    }
}

但是现在我有一个ViewModel组件,并且要在此活动的子片段之间共享数据,并管理其生命周期,我需要在Activity中获取此组件,因此我让它扩展LifecycleActivity。

public class StepMasterActivity extends LifecycleActivity {

    @Override
    public class StepMasterActivity extends LifecycleActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_step_master);
        // setToolbar();
        SharedViewModel sharedViewModel = ViewModelProviders.of(this).get(SharedViewModel.class);
    }
}

但我注意到LifecycleActivity与AppCompatActivity和FragmentActivity没有任何关系。

public class LifecycleActivity extends FragmentActivity implements LifecycleRegistryOwner {
    private final LifecycleRegistry mRegistry = new LifecycleRegistry(this);

    public LifecycleActivity() {
    }

    public LifecycleRegistry getLifecycle() {
        return this.mRegistry;
    }
}

我做错了什么吗?

2个回答

38

更新于2017-10-05: LifecycleActivity 已被弃用。如果你使用 support-fragmentappcompat-v726.1.0 或更高版本,则 FragmentActivityAppCompatActivity 都实现了 LifecycleOwner 接口。

以下是原始的回答,仅供历史(和可能的滑稽)目的。


引用文档

注意:由于 Architecture Components 此时还处于预览阶段,因此 Fragment 和 AppCompatActivity 类无法实现它 (因为我们不能从稳定组件添加到不稳定的 API 的依赖关系)。在 Lifecycle 稳定之前,提供 LifecycleActivity 和 LifecycleFragment 类以方便开发者使用。在 Lifecycles 项目发布后,支持库的 fragments 和 activities 将实现 LifecycleOwner 接口; 到那时 LifecycleActivity 和 LifecycleFragment 将被弃用。

LifecycleActivity 绑定的是 FragmentActivity,而不是 AppCompatActivity

你可以根据以下方式创建自己的 AppCompatLifecycleActivity

public class AppCompatLifecycleActivity extends AppCompatActivity implements LifecycleRegistryOwner {

    private final LifecycleRegistry mRegistry = new LifecycleRegistry(this);

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

1
LifecycleRegistry只是这样的吗?所以我可以创建自定义的“LifecycleRegistryOwner”,而不是让片段扩展LifecycleFragment吗?(暂时) - alexpfx
@alexpfx:正确。再次引用文档:"任何自定义片段或活动都可以通过实现内置的LifecycleRegistryOwner接口(而不是扩展LifecycleFragment或LifecycleActivity)来转换为LifecycleOwner。" - CommonsWare
@superarts.org:我不明白这与问题有什么关系,更不用说与答案有任何关联了。请提出一个单独的问题,其中包括一个[minimal, complete, and verifiable example]以及详细解释您的问题。 - CommonsWare
@CommonsWare,哇。像魔法一样好用。 - Hiren Patel
@HirenPatel:如果您升级到支持库的26.1.0或更高版本,则不需要此代码片段。FragmentActivity现在实现了LifecycleOwner,而AppCompatActivity扩展了FragmentActivity,因此AppCompatActivity也实现了LifecycleOwner - CommonsWare
好的。谢谢你分享它。 - Hiren Patel

3
最新的支持库版本 26.1.0 可以让您使用 AppCompatActivity

FragmentFragmentActivityAppCompatActivity 的基类) 现在实现了 Architecture Components 的 LifecycleOwner 接口。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接