【发布时间】:2015-03-28 04:56:43
【问题描述】:
我的活动从通用基础活动扩展而来,我在其中声明和初始化公共变量,例如 Context 类型的 context、Activity 类型的 activity 和 ActionBar 类型的 mActionBar。
因此,这避免了我所有应用活动中的冗余初始化代码。
但是随着Toolbar 的出现,我对如何做到这一点有点困惑。 Toolbar 不像 ActionBar 而是替代了它,还扩展了它。
ActionBar 是一个视图对象,始终可供 ActionBar 活动检索,它位于创建的视图之上。这没有在任何地方的布局 XML 中声明。
但 Toolbar 仅在布局 XML 中声明,因此我必须将它包含在我创建的每个布局中,否则我将无法访问 Toolbar 对象。
我通常在每个单独活动的onCreate 方法中使用setContentView(R.layout.mylayout)。然后我必须使用findViewById 初始化我的工具栏对象。因此我不能把这段代码放在我的 BaseActivity 的 onCreate 函数中,因为 setContentView 还没有被初始化。
即使我使用它的构造函数以编程方式创建工具栏,并尝试将视图添加到层次结构的顶部,我仍然必须逐个布局和逐个活动地执行此操作,因为某些布局是相对布局的作为根对象,其他的则不同。所以这些仍然会有单独的代码考虑。
我之所以对我的Activity继承Toolbar的好方法感到好奇,是因为突然要求Android 4.0-4.4设备使用v7兼容包,将actionbar完全替换为Toolbar对于Google来说是一场彻头彻尾的噩梦对象,使用 v4 兼容包片段而不是原生片段,全部使用最新的设计范例。
【问题讨论】:
-
“嘿,看看 v21 !但是你的 v17 设备需要使用 v4 对象来检查它”
-
您可以在基础Activity类中使用Toolbar设置内容View,并将子类的Views膨胀到基础布局中的容器ViewGroup中。
-
@MikeM。我觉得这将是一个问题。我还使用了位于 ToolBar 前面的 NavigationDrawer 的 DrawerLayout,它需要是根元素。在其他情况下,我还使用其他依赖于作为根元素的库
-
在这种情况下,您可以为 Toolbar 创建一个单独的布局,然后在基础的
onCreate()方法中对其进行膨胀和初始化,但不要在子类之后将其添加到屏幕布局中致电setContentView()。 -
@kip2 我确实想出了一个解决方案,我的基本活动有一个工具栏变量,但我所有的子活动都必须重新声明它,因为它现在在我的所有 XML 布局中都重复了。一个活动不会覆盖另一个活动对工具栏对象的使用
标签: android android-layout layout android-fragments android-toolbar