如何在扩展 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.0support-fragmentappcompat-v7 中的更高版本,则FragmentActivityAppCompatActivity 都实现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 扩展了FragmentActivityAppCompatActivity 也实现了LifecycleOwner【参考方案2】:

The most recent support library revision26.1.0 将允许您使用AppCompatActivity

Fragment 和 FragmentActivity(AppCompatActivity 的基类) 现在从 Architecture 实现 LifecycleOwner 接口 组件。

【讨论】:

以上是关于如何在扩展 LifecycleActivity 的视图中设置SupportActionBar的主要内容,如果未能解决你的问题,请参考以下文章

如何在WPF中设置小扩展头和扩展内容?

如何在IIS添加MIME扩展类型

如何在通知服务扩展中为通知内容扩展预加载资源

如何在扩展中抛出异常?

如何在已经扩展 Thread 的类中扩展 JFrame

如何调用动作扩展?