Android Studio生成的样板创建了一种扩展Theme.AppCompat.Light.DarkActionBar
的样式。不知何故,这会在我所有活动的顶部添加一个操作栏/工具栏。
这是怎么发生的?条在哪里定义?在布局中不存在。
答案 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