我的活动扩展到通用基础活动,我在其中声明和初始化类型为Context的context
,活动类型的activity
和类型为ActionBar
的mActionBar的公共变量。
因此,这可以避免我所有应用程序活动中的冗余初始化代码。
但是随着Toolbar
的出现,我对如何做到这一点感到有些困惑。工具栏与ActionBar不同并替换它,但也扩展了它。
ActionBar是一个视图对象,它始终可供ActionBar活动检索,并且位于创建的视图之上。这在任何地方都没有在布局XML中声明。
但工具栏仅在布局XML中声明,因此我必须将其包含在我创建的每个布局中,否则我将无法访问工具栏对象。
我通常在每个活动的setContentView(R.layout.mylayout)
方法中使用onCreate
。然后我必须使用findViewById
初始化我的工具栏对象。因此,我无法将此代码放入我的BaseActivity的onCreate函数中,因为setContentView
尚未初始化。
即使我使用它的构造函数以编程方式创建工具栏,并尝试将视图添加到层次结构的顶部,我仍然必须按布局布局,并按活动基础执行活动,因为一些布局是RelativeLayout作为根对象,而其他布局是不同的。所以这些仍然会有单独的代码注意事项。
我很好奇我的活动继承工具栏的好方法是因为谷歌突然要求Android 4.0-4.4设备使用v7兼容包,完全用工具栏替换动作栏是一个彻头彻尾的噩梦对象,使用v4兼容包片段而不是本机片段,都使用最新的设计范例。
答案 0 :(得分:4)
这是我的实施。希望它可以帮到某人。
public abstract class BaseActivity extends AppCompatActivity {
Toolbar toolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
protected boolean useToolbar() {
return true;
}
@Override
public void setContentView(int layoutResID) {
View view = getLayoutInflater().inflate(layoutResID, null);
configureToolbar(view);
super.setContentView(view);
}
private void configureToolbar(View view) {
toolbar = (Toolbar) view.findViewById(R.id.toolbar);
if (toolbar != null) {
if (useToolbar()) {
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
} else {
toolbar.setVisibility(View.GONE);
}
}
}
}
从这里开始,您只需扩展BaseActivity。如果您不想要工具栏,则必须覆盖useToolbar()。
别忘了在顶部添加activity.xml
<include layout="@layout/toolbar" />
toolbar.xml
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
</merge>