【问题标题】:Actionbar, Toolbar, activity inheritanceActionbar, Toolbar, 活动继承
【发布时间】:2015-03-28 04:56:43
【问题描述】:

我的活动从通用基础活动扩展而来,我在其中声明和初始化公共变量,例如 Context 类型的 context、Activity 类型的 activityActionBar 类型的 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


【解决方案1】:

这是我的实现。希望它可以帮助某人。

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" />

工具栏.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>

【讨论】:

    猜你喜欢
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 2012-04-12
    • 2010-10-28
    相关资源
    最近更新 更多