AppCompat在哪里设置操作栏/工具栏?

时间:2019-01-02 00:36:36

标签: android android-studio android-layout

Android Studio生成的样板创建了一种扩展Theme.AppCompat.Light.DarkActionBar的样式。不知何故,这会在我所有活动的顶部添加一个操作栏/工具栏。

这是怎么发生的?条在哪里定义?在布局中不存在。

3 个答案:

答案 0 :(得分:1)

Android Studio会夸大它们已经定义的自定义View或ViewGroup,其中大多数是看不见的,因为它们是私有类。

这里是如何在代码中执行此操作的示例。

class Test extends android.support.v7.widget.AppCompatTextView {


    public Test(Context context) {
        super(context);
        initTestView(null);
    }

    public Test(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        initTestView(attrs);
    }

    public Test(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initTestView(attrs);
    }

    public void initTestView(AttributeSet as) {
        if (as != null) {
            TypedArray ta = getContext().obtainStyledAttributes(as, R.styleable.Test);

            String textOverride = ta.getString(R.styleable.Test_override);
            ta.recycle();

            setText("Test: " + textOverride);
        }
    }

}

然后,您将在app/src/main/res/values/attr.xml

中定义一个样式
<declare-styleable name="Test">
    <attr name="override" format="string" />
</declare-styleable>

现在,当Android对它进行夸大处理时,它可以看到您的自定义类以及用于构造它的属性。如果将其添加到布局中,它将自动生成我的代码的示例视图。这与Android的核心样式Views / ViewGroups相同,并且当它们膨胀并附加到其父视图时,它们通常会具有这些类的默认值或可见表示。

为清楚起见,当您在布局中添加Android View时,为简单起见。

<TextView
  android:id="@+id/hello"
  android:text="@string/greeting"/>

TextView的类通过抓取其类型化的属性(文本,ID)并填充其内部的View或值,与我的示例initTestView方法具有相似的作用。从本质上讲,这是Android如何将xml值粘合到其类表示形式。

答案 1 :(得分:0)

Chris Sullivan的帮助下,我们弄清楚了发生了什么。这是一个估计的猜测。

事实证明,使用Theme.AppCompat.Light.DarkActionBar样式/主题只会为所有活动添加某种类型的上边距,并用原色填充它们。这样一来,它在Android编辑器中的外观就好像有一个应用程序栏/工具栏/操作栏,但只是烟雾和镜子。

实际的应用栏是在运行时由AppCompatActivity添加的。

答案 2 :(得分:-1)

这是在样式xml中定义的。您的应用程序从此扩展。如果您希望它消失,则可以扩展其他样式,例如Theme.AppCompat.Light.NoActionBar