动作栏,工具栏,活动继承

时间:2015-01-29 03:48:01

标签: android android-layout layout android-fragments android-toolbar

我的活动扩展到通用基础活动,我在其中声明和初始化类型为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兼容包片段而不是本机片段,都使用最新的设计范例。

1 个答案:

答案 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>