叠加操作栏 - Android Studio 教程

Overlaying Action Bar - Android Studio Tutorial

运行 在使用 Android 教程 http://developer.android.com/training/basics/actionbar/overlaying.html

时遇到了一个小问题

我创建了一个自定义操作栏主题,其中 android:windowActionBarOverlay 属性 已设置为 true。

<!-- the theme applied to the application or activity -->
<style name="CustomActionBarTheme"
    parent="@style/Theme.AppCompat.Light.DarkActionBar">
    <item name="android:windowActionBarOverlay">true</item>

    <!-- Support library compatibility -->
    <item name="windowActionBarOverlay">true</item>
</style>

然后我将这个主题应用于清单中的整个应用程序

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/CustomActionBarTheme"  >

当时的问题是该栏覆盖了应用程序中需要保持可见的部分。我按照应用程序的说明添加了以下内容,它修复了第一个视图(您在其中输入消息并点击发送)

android:paddingTop="attr/actionBarSize"

然而下面的activity,应该显示消息,仍然被操作栏覆盖。我想知道我在哪里添加顶部填充,以便我也可以修复此视图。 我做了一些搜索,发现这个 'display message' activity 的布局是在 .java 文件中定义的 (至少我认为是)

//Create the text view
    TextView textView = new TextView(this);
    textView.setTextSize(40);
    textView.setText(message);

    //Set the text view as the activity layout
    setContentView(textView);

我尝试做一个 textView.setPadding() 但那个函数只接受整数作为参数所以我不能传递像 "attr/actionBarSize"

这样的东西

重申:需要帮助确定显示消息 activity 的布局位置以及如何编辑它以便我可以像设置主视图一样设置顶部填充。

谢谢!

您可以获取 ActionBar 的高度作为一个整数:

int actionBarHeight = 0;

TypedValue tv = new TypedValue();
if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) {
    actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics());
}

您可以将该值用于 setPadding()setMargins()

或者您可以将顶部 margin/padding 添加到您的第二个 activity 布局文件,但是如果不查看代码或活动的 xml 布局文件就很难提供帮助。

我按照 Android 教程遇到了这个完全相同的问题。 Jones 的上述回答解决了这个问题,但这里有一种在布局 xml 文件中为显示消息 activity 使用 android:paddingTop="?attr/actionBarSize" 的方法。

如果您遵循教程 Starting Another Activity and Add Up Button for Low-level Activities,您最终会得到 /java/com.something.myfirstapp/DisplayMessageActivity.java,例如:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_displaymessage);

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    // Get the message from the intent
    Intent intent = getIntent();
    String message = intent.getStringExtra(MyActivity.EXTRA_MESSAGE);

    // Create the text view
    TextView textView = new TextView(this);
    textView.setTextSize(40);
    textView.setText(message);

    // Set the text view as the activity layout
    setContentView(textView);
}

上面的代码创建了一个超出此 activity 布局文件范围的新 TextView。相反,您要做的是重用 /res/layout/activity_display_message.xml 文件中已声明的 "Hello World" TextView:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="my.vstore.myfirstapp.DisplayMessageActivity">

<TextView android:text="@string/hello_world"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

</RelativeLayout>

给 TextView 添加一个 id android:id="@+id/display_message" 然后把 paddingTop 改成 android:paddingTop="?attr/actionBarSize":

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="?attr/actionBarSize"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="my.vstore.myfirstapp.DisplayMessageActivity">

<TextView android:id="@+id/display_message"
    android:text="@string/hello_world"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

</RelativeLayout>

然后,找到TextView的id,在/java/com.something.myfirstapp/DisplayMessageActivity.java中设置Text:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_displaymessage);

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    // Get the message from the intent
    Intent intent = getIntent();
    String message = intent.getStringExtra(MyActivity.EXTRA_MESSAGE);

    // Find the text view
    TextView textView = (TextView) findViewById(R.id.display_message);
    textView.setTextSize(40);
    textView.setText(message);
}

因此,您可以在布局 xml 文件中使用 android:paddingTop="?attr/actionBarSize" 来显示消息 activity。