【问题标题】:How to setSupportActionBar in a view that extends LifecycleActivity如何在扩展 LifecycleActivity 的视图中设置SupportActionBar
【发布时间】: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;
    }
}

我做错了吗?

【问题讨论】:

    标签: android android-activity activity-lifecycle android-architecture-components android-architecture-lifecycle


    【解决方案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 接口 组件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多