如何在扩展 LifecycleActivity 的视图中设置SupportActionBar
Posted
技术标签:
【中文标题】如何在扩展 LifecycleActivity 的视图中设置SupportActionBar【英文标题】:How to setSupportActionBar in a view that extends LifecycleActivity 【发布时间】:2017-11-23 15:59:47 【问题描述】:我有一个扩展 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;
我做错了吗?
【问题讨论】:
【参考方案1】:2017-10-05 更新:LifecycleActivity
已被弃用。如果您使用26.1.0
或support-fragment
和appcompat-v7
中的更高版本,则FragmentActivity
和AppCompatActivity
都实现LifecycleOwner
。
出于历史(可能是歇斯底里)的目的,原始答案出现在下面。
引用the documentation:
注意:由于架构组件处于 alpha 阶段,Fragment 和 AppCompatActivity 类无法实现它(因为我们无法将稳定组件的依赖项添加到不稳定的 API)。在 Lifecycle 稳定之前,提供 LifecycleActivity 和 LifecycleFragment 类是为了方便。 Lifecycles 项目发布后,支持库片段和活动将实现 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;
【讨论】:
LifecycleRegistry 就是这样?所以我可以创建自定义“LifecycleRegistryOwner”而不是让片段扩展 LifecycleFragment? (暂时) @alexpfx:正确。再次引用the documentation:“通过实现内置的 LifecycleRegistryOwner 接口(而不是扩展 LifecycleFragment 或 LifecycleActivity),任何自定义片段或活动都可以变成 LifecycleOwner。” @superarts.org:我看不出这与这个问题有什么关系,更不用说这个答案了。请提出一个单独的问题,提供minimal reproducible example 并更详细地解释您的问题。 @CommonsWare,哇。像魅力一样工作。 @HirenPatel:如果您升级到26.1.0
或更高版本的支持库,则不需要此 sn-p。 FragmentActivity
现在实现了LifecycleOwner
,由于AppCompatActivity
扩展了FragmentActivity
,AppCompatActivity
也实现了LifecycleOwner
。【参考方案2】:
The most recent support library revision26.1.0
将允许您使用AppCompatActivity
Fragment 和 FragmentActivity(AppCompatActivity 的基类) 现在从 Architecture 实现 LifecycleOwner 接口 组件。
【讨论】:
以上是关于如何在扩展 LifecycleActivity 的视图中设置SupportActionBar的主要内容,如果未能解决你的问题,请参考以下文章